【发布时间】:2015-07-04 22:42:48
【问题描述】:
我的解决方案包含三个项目:GoogleTest(用于使用 Google Test)、Vi(用于大部分逻辑)和 ViTests(用于使用 Vi 的单元测试)。 ViTests 项目引用 Vi 项目和 Google Test 项目。
Vi在v1.h中有如下代码
#pragma once
namespace Vi
{
class Vi1
{
public:
int SomeInt();
};
}
以及匹配的 v1.cpp
#include "vi1.h"
namespace Vi
{
int Vi1::SomeInt()
{
return 123;
}
}
ViTests 中的测试函数如下
TEST(Vi1Foo, SomeIntIsSame)
{
Vi1 v = Vi1{};
EXPECT_EQ(123, v.SomeInt());
}
链接器错误表明存在未解析的符号SomeInt。但是,我可以通过像这样内联函数来消除链接器错误:
namespace Vi
{
class Vi1
{
public:
int SomeInt() { return 123; }
};
}
为什么将单元测试项目放在单独的 cpp 文件中时找不到 SomeInt 函数定义?
谢谢。
额外的细节以防有用:我使用的是 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
项目类型: Vi 是 Win32 应用程序,ViTests 是 Win32 控制台应用程序,GoogleTest 是一个静态库。
【问题讨论】:
-
您是否使用函数定义链接到文件?
-
我不明白你的意思。我应该在“附加依赖项”列表中包含 cpp 文件名吗?
-
如何链接到带有函数定义的文件?
-
是的,你可能会,但我以前从未使用过 VS
-
我不确定 C++ Win32 控制台项目(如
ViTests)引用 C++ Win32 应用程序项目(如Vi)意味着什么。ViTests需要链接到V1.obj- 直接作为目标文件,或间接通过以V1.obj为成员创建的静态库。我不确定引用 Win32 应用程序项目是否会做这些事情。我认为您需要将V1.obj(可能还有其他目标文件)作为输入文件添加到ViTests项目中的链接器。