4

我正在使用谷歌测试框架来设置一些单元测试。我的解决方案中有三个项目:

  • FN(我的项目)
  • FN_test(我的测试)
  • gtest(谷歌测试框架)

我将 FN_test 设置为将 FN 和 gtest 作为引用(依赖项),然后我想我已经准备好设置我的测试了(我已经将每个人都设置为 /MTd(不这样做会导致我之前链接错误)) .

特别是,我在 FN 中定义了一个名为 Embark 的类,我想使用 FN_test 进行测试。到目前为止,一切都很好。因此,我使用 googletest 编写了一个名为 EmbarkTest 的类,声明了成员 Embark* 并在构造函数中写入:

EmbarkTest() {
  e = new Embark(900,2010);
}

然后,按 F7,我得到以下信息:

1>FN_test.obj : error LNK2019: unresolved external symbol "public: __thiscall Embark::Embark(int,int)" (??0Embark@@QAE@HH@Z) referenced in function "protected: __thiscall EmbarkTest::EmbarkTest(void)" (??0EmbarkTest@@IAE@XZ) 1>D:\Users\lg\Product\code\FN\Debug\FN_test.exe : fatal error LNK1120: 1 unresolved externals

有人知道我做错了什么和/或我能做些什么来解决这个问题吗?

编辑:来自 Embark.h 的相关代码

class Embark
{
public:

   //Constructor for initial state
   Embark(int _id, int _year);
   //Destructor
   ~Embark();   
/* ... */
}
4

3 回答 3

3

我发现答案很简单。经过两天激烈的磕头,是这样的:

您必须将主项目编译为.lib而不是.exe

完成此操作后,所有链接都成为一种幸福。我认为 Visual Studio 会自动为我执行此操作,因为我从 FN_test 声明了对 FN 的依赖:我假设 Visual Studio 会创建库。它没有。


RANT (此后无需阅读)
由于很少将一个生成可执行文件的项目链接到另一个执行相同操作的项目,因此查找此类问题的参考资料有些困难。谷歌搜索没有给我带来有用的结果。MSDN 论坛也无济于事。

但是,当您对应用程序进行单元测试时,是否会经常发生这种情况,例如,测试项目和应用程序项目在同一个解决方案上?我对 C++ 的其他测试框架一无所知。我选择了谷歌测试框架:

  1. 我们信任谷歌
  2. 很棒的文档
  3. 使用和理解非常简单

但是,它在集成方面并没有太大的优点。我认为其他工具会更好地集成到 Visual Studio,包括 IDE 响应能力。但我宁愿现在受苦,也不愿事后受苦。我希望这个工具不断改进,因为我喜欢它。

于 2010-03-25T12:55:15.430 回答
1

链接器找不到Embark构造函数的定义。

  • 您是否在某处定义了该构造函数?
  • 您的测试项目实际上是否链接到 FN 库?
于 2010-03-24T12:39:12.253 回答
1

链接器找不到Embark::Embark(int, int)

这是 MSDN 关于错误LNK2019的说明。

于 2010-03-24T12:41:01.453 回答