我无法弄清楚哪里有错误。我正在创建一个DLL,然后在C ++控制台程序(Windows 7,VS2008)中使用它。但是在尝试使用DLL函数时我得到LNK2019 unresolved external symbol
。
首先是出口:
#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,其中包含Linker-> General->附加库目录中的DLL:
#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
}
我无法弄清楚这里出了什么问题;它必须是非常简单和基本的东西。
答案 0 :(得分:12)
您正在导出类成员函数void MyFuncLibInterface::myFunc(std::string param);
,但尝试导入自由函数void myFunc(std::string param);
确保您在DLL项目中#define MyFuncLib_EXPORTS
。确保您在控制台应用中#include "MyFuncLibInterface.h"
而不是定义MyFuncLib_EXPORTS
。
DLL项目将会看到:
class __declspec(dllexport) MyFuncLibInterface {
...
}:
控制台项目将会看到:
class __declspec(dllimport) MyFuncLibInterface {
...
}:
这允许您的控制台项目使用dll中的类。
编辑:回应评论
#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导入”
答案 1 :(得分:1)
您需要导入类而不是函数。之后,您可以调用类成员。
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
}