我在Visual Studio 2019中创建了一个C++项目。我添加了两个文件:MyClass.hpp
和MyClass.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。
你需要额外的设置:
- 确保项目B构建为库(而不是可执行文件(
- 考虑两个项目都可以访问的两条路径。这将是项目B库的安装位置。这包括两件事:
- 二进制文件(静态库是最简单的设置(
- 库标头
-
在编译项目B时,您需要将生成的二进制文件和标头都安装到这些路径中。为此,您可以进行构建后步骤,复制必要的文件:属性»构建事件»构建后事件
或者只使用项目B的构建文件夹和源位置。
-
项目A:
- 将头路径添加到包含路径:
属性»C/C++»常规»其他包含目录 - 将库添加到要链接的库列表中:
属性»链接器»输入»其他依赖项 - 将二进制路径添加到链接库搜索
属性»链接器»常规»其他库目录
- 将头路径添加到包含路径:
只是在前面的评论/答案中添加一些内容:
您没有提到您将参考项目构建为静态库还是动态库。
这可以通过进入项目的属性->常规->配置类型进行设置
请注意,如果选择Dynamic Library (.dll)
,则默认情况下不会导出符号(如MyClass::SetData(struct Data)
(,并且需要添加__declspec(dllexport)
关键字。参见此处