С++ экспорт и использование функции 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
}