所以,我有两个项目,项目2构建到一个dll,我有这个类(标题和cpp跟随)
头
class classWvirts
{
public:
classWvirts(){};
~classWvirts(){};
virtual int testVirtualFunction();
};
CPP
#include "classWvirts.h"
int classWvirts::testVirtualFunction()
{
return 1;
}
在项目1(构建到exe)中,我只有一个.cpp文件,如下所示:
#include "../testApp2/classWvirts.h"
classWvirts obj1;
int main()
{
obj1.testVirtualFunction();
}
这个设置似乎有它的所有成分,我的方法,虽然它标记为虚拟,在其cpp文件中有一个简单的定义。
然而,当我尝试编译它时,我得到一个看起来像
的LNK2001链接器错误错误1错误LNK2019:未解析的外部符号“public:virtual int __thiscall classWvirts :: testVirtualFunction(void)”(?testVirtualFunction @ classWvirts @@ UAEHXZ)在函数_main中引用E:\ Work \ Scratch \ US1212_Virt \ testApp \ testApp \ source.obj testApp
有人可以指出我做错了什么吗?我意识到,如果我把简单的定义放在头文件中,一切都会起作用,但如果那不是一个选项呢? (这显然是我在一个更大的项目中遇到的问题的简化版本),可能有空间将cpp变成inl并将其包含在标题中,但我宁愿避免这种情况并保持我的cpp和标题区别。
答案 0 :(得分:2)
使用Visual Studio编译器制作DLL时,必须通过在库中使用__declspec(dllexport)
声明该类来从DLL库中导出该类
class __declspec(dllexport) classWvirts
{
...
您必须在主项目中通过在主项目中使用__declspec(dllimport)
声明它来导入它
class __declspec(dllimport) classWvirts
{
为了对导入和导出使用相同的头文件,可以引入宏
#define MY_DLL_IMPORT_EXPORT ...
class MY_DLL_IMPORT_EXPORT classWvirts
{
...
在编译DLL时将定义为__declspec(dllexport)
,在所有其他情况下定义为__declspec(dllimport)
(即在编译主项目时)。
如果在DLL项目上创建主项目的依赖项,Visual Studio应自动处理其他链接器设置(即它会自动将主项目与DLL的导入库链接)。如果您没有该依赖关系,则创建它或在主项目的链接器设置中手动指定DLL导入库。