我的解决方案有三个项目:GoogleTest(用于使用 Google Test)、Vi(用于大部分逻辑)和 ViTests(用于使用 Vi 的单元测试)。ViTests 项目引用了 Vi 项目和 Google Test 项目。
vi在v1.h中有如下代码
#pragma once
namespace Vi
{
class Vi1
{
public:
int SomeInt();
};
}
Run Code Online (Sandbox Code Playgroud)
和匹配的 v1.cpp
#include "vi1.h"
namespace Vi
{
int Vi1::SomeInt()
{
return 123;
}
}
Run Code Online (Sandbox Code Playgroud)
ViTests中的测试功能如下
TEST(Vi1Foo, SomeIntIsSame)
{
Vi1 v = Vi1{};
EXPECT_EQ(123, v.SomeInt());
}
Run Code Online (Sandbox Code Playgroud)
链接器错误说有一个未解析的符号SomeInt。但是,我可以通过像这样内联函数来消除链接器错误:
namespace Vi
{
class Vi1
{
public:
int SomeInt() { return 123; }
};
}
Run Code Online (Sandbox Code Playgroud)
为什么将单元测试项目SomeInt放在单独的 cpp 文件中时找不到函数定义?
谢谢。
额外的细节很有用:我正在使用 Visual Studio 2015。
错误信息:
Error LNK2019 unresolved external symbol "public: int __thiscall Vi::Vi1::SomeInt(void)" (?SomeInt@Vi1@Vi@@QAEHXZ) referenced in function "private: virtual void __thiscall ViTests::Vi1Foo_SomeIntIsSame_Test::TestBody(void)" (?TestBody@Vi1Foo_SomeIntIsSame_Test@ViTests@@EAEXXZ) Vi_Tests C:\Users\MyName\Vi\Vi_Tests\Vi_Tests.obj 1
Run Code Online (Sandbox Code Playgroud)
项目类型:Vi 是 Win32 Application,ViTests 是 Win32 Console Application,GoogleTest 是一个静态库。
我在一个愚蠢的错误假设下工作。我假设 VS 只会获取 cpp 文件,因为我正在引用包含它们的项目并包含正确的头文件,但事实并非如此。
nabijaczleweli 说我应该“链接到带有函数定义的文件”。在网上探索了一些之后,我发现了如何做到这一点。我发现这篇文章概述了一个解决方案。cpp 文件本身必须添加到测试项目中。这是通过右键单击 ViTests,选择“添加现有文件”并选择 vi1.cpp 来完成的。
这有效,但我对这个解决方案非常不满意,因为我必须在需要时添加这些文件。我发现我可以解决这个将 Vi 的项目类型更改为静态库的问题。这在此处进行了描述。Michael Burr 的评论描述了一种链接到同样有效的目标文件的方法。
如果没有这个帖子中的海报的帮助,我不会这么快就想通了。非常感谢人们。
| 归档时间: |
|
| 查看次数: |
2739 次 |
| 最近记录: |