cpp文件中具有普通定义的虚函数导致链接器错误

时间:2014-10-09 03:04:00

标签: c++ linker-errors virtual-functions

所以,我有两个项目,项目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和标题区别。

1 个答案:

答案 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导入库。