С++ экспорт и использование функции dll

Я не могу понять, где ошибка. Я создаю DLL, а затем использую его в консольной программе на С++ (Windows 7, VS2008). Но я получаю LNK2019 unresolved external symbol при попытке использовать DLL-функции.

Сначала экспортируем:

#ifndef __MyFuncWin32Header_h
#define __MyFuncWin32Header_h

#ifdef MyFuncLib_EXPORTS
#  define MyFuncLib_EXPORT __declspec(dllexport)
# else
#  define MyFuncLib_EXPORT __declspec(dllimport)
# endif  

#endif

Это один заголовочный файл, который я затем использую в:

#ifndef __cfd_MyFuncLibInterface_h__
#define __cfd_MyFuncLibInterface_h__

#include "MyFuncWin32Header.h"

#include ... //some other imports here

class  MyFuncLib_EXPORT MyFuncLibInterface {

public:

MyFuncLibInterface();
~MyFuncLibInterface();

void myFunc(std::string param);

};

#endif

Затем в консольной программе есть dllimport, в котором есть DLL, включенная в каталоги Linker- > General- > Additional Library:

#include <stdio.h>
#include <stdlib.h>
#include <iostream>


__declspec( dllimport ) void myFunc(std::string param);


int main(int argc, const char* argv[])
{
    std::string inputPar = "bla";
    myFunc(inputPar); //this line produces the linker error
}

Я не могу понять, что здесь происходит; это должно быть что-то действительно простое и фундаментальное.

Ответ 1

Вы экспортируете функцию члена класса void MyFuncLibInterface::myFunc(std::string param);, но пытаетесь импортировать свободную функцию void myFunc(std::string param);

Убедитесь, что вы #define MyFuncLib_EXPORTS в проекте DLL. Убедитесь, что вы #include "MyFuncLibInterface.h" в консольном приложении, не определяя MyFuncLib_EXPORTS.

В DLL-проекте будет показано:

class  __declspec(dllexport) MyFuncLibInterface {
...
}:

И консольный проект увидит:

class  __declspec(dllimport) MyFuncLibInterface {
...
}:

Это позволяет вашему проекту консоли использовать класс из dll.

EDIT: В ответ на комментарий

#ifndef FooH
#define FooH

#ifdef BUILDING_THE_DLL
#define EXPORTED __declspec(dllexport)
#else
#define EXPORTED __declspec(dllimport)
#endif

class EXPORTED Foo {
public:
  void bar();
};


#endif

В проекте, который реализует Foo::bar() BUILDING_THE_DLL, должен быть определен. В проекте, который пытается использовать Foo, BUILDING_THE_DLL не следует определять. Оба проекта должны #include "Foo.h", но только проект DLL должен содержать "Foo.cpp"

Когда вы создаете DLL, класс Foo и все его члены помечены как "экспортированные из этой DLL". Когда вы строите любой другой проект, класс Foo и все его члены помечены как "импортированные из DLL"

Ответ 2

Вам нужно импортировать класс, а не функцию. После этого вы можете вызвать член класса.

class  __declspec( dllimport ) MyFuncLibInterface {

public:

MyFuncLibInterface();
~MyFuncLibInterface();

void myFunc(std::string param);

};

int main(int argc, const char* argv[])
{
std::string inputPar = "bla";
MyFuncLibInterface intf;
intf.myFunc(inputPar); //this line produces the linker error
}