cpp文件中具有琐碎定义的虚拟函数导致链接器错误

Virtual functions with trivial definitions in cpp file causing linker errors

本文关键字:函数 虚拟 链接 错误 定义 文件 cpp      更新时间:2023-10-16

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

使用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导入库。