【问题标题】:Virtual functions with trivial definitions in cpp file causing linker errorscpp 文件中具有简单定义的虚函数导致链接器错误
【发布时间】:2014-10-09 03:03:59
【问题描述】:

所以,我有两个项目,项目 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();
}

这个设置似乎有它工作的所有要素,我的方法,虽然它被标记为 virtual ,但在它的 cpp 文件中有一个简单的定义。

但是,当我尝试编译它时,我得到一个 LNK2001 链接器错误,看起来像

错误 1 ​​错误 LNK2019:在函数 _main E:\Work\Scratch\US1212_Virt\testApp\testApp 中引用的未解析外部符号“public: virtual int __thiscall classWvirts::testVirtualFunction(void)”(?testVirtualFunction@classWvirts@@UAEHXZ) \Source.obj testApp

有人可以指出我做错了什么吗?我意识到如果我将简单的定义放在头文件中,一切都会正常工作,但如果这不是一个选项怎么办? (这显然是我在大型项目中遇到的问题的简化版本),可能有空间将 cpp 变成 inl 并将其包含在标头中,但我宁愿避免这种情况并保持我的 cpp 和标头区别。

【问题讨论】:

  • 与 DLL 导入库链接。还将该类声明为 dll-export。我不记得确切的语法,它是微软特有的。
  • 是的,刚刚得出这个结论 :) 感谢您的支持。

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-08
    • 1970-01-01
    • 2018-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-22
    • 1970-01-01
    相关资源
    最近更新 更多