为什么在添加对测试项目的引用后仍然"unresolved external symbol"错误?



我在Visual Studio 2019中创建了一个C++项目。我添加了两个文件:MyClass.hppMyClass.cpp。然后我创建了一个测试项目,并添加了原始项目作为参考。

如果我双击测试项目中的引用,我可以看到MyClass。但如果我尝试运行测试,我会得到以下错误:

MyTest.obj : error LNK2019: unresolved external symbol "public: struct MyRef __thiscall MyClass::SetData(struct Data)" (?SetData@MyClass@@QAE?AUMyRef@@UData@@@Z) referenced in function "private: virtual void __thiscall MyTest_SetData_Test::TestBody(void)" (?TestBody@MyTest_SetData_Test@@EAEXXZ)

我做错了什么?为什么MyClass.cpp没有编译,即使它在引用的项目中?我可以毫无错误地构建原始项目。当我试图构建测试项目时,我只得到链接错误。


我遇到了这个关于未解决的外部符号错误的问题,但它并没有解决我的问题。这是Visual Studio特有的问题。

如果我手动将MyClass.cpp添加到测试项目中,那么它就可以工作了。但我不想对每个文件都这样做,因为我的项目可能有更多的cpp源文件,而不仅仅是这个。我想使用"引用"功能使其工作。

当我创建测试项目时,我选择了原始项目作为参考。

将项目B作为引用添加到项目A基本上只确保在编译项目A时编译项目B。

你需要额外的设置:

  1. 确保项目B构建为库(而不是可执行文件(
  2. 考虑两个项目都可以访问的两条路径。这将是项目B库的安装位置。这包括两件事:
    • 二进制文件(静态库是最简单的设置(
    • 库标头
  3. 在编译项目B时,您需要将生成的二进制文件和标头都安装到这些路径中。为此,您可以进行构建后步骤,复制必要的文件:属性»构建事件»构建后事件

    或者只使用项目B的构建文件夹和源位置。

  4. 项目A:

    • 将头路径添加到包含路径:
      属性»C/C++»常规»其他包含目录
    • 将库添加到要链接的库列表中:
      属性»链接器»输入»其他依赖项
    • 将二进制路径添加到链接库搜索
      属性»链接器»常规»其他库目录

只是在前面的评论/答案中添加一些内容:

您没有提到您将参考项目构建为静态库还是动态库。

这可以通过进入项目的属性->常规->配置类型进行设置

请注意,如果选择Dynamic Library (.dll),则默认情况下不会导出符号(如MyClass::SetData(struct Data)(,并且需要添加__declspec(dllexport)关键字。参见此处

相关内容

最新更新