Google 测试:错误 LNK2019:Visual Studio 2013 无法解析的外部符号

Google Test: error LNK2019: unresolved external symbol with Visual Studio 2013

提问人:Solti 提问时间:8/16/2014 更新时间:6/17/2021 访问量:25315

问:

我正在尝试使用Google Test framework + Visual Studio 2013进行我的第一个单元测试,但是我遇到了以下错误,不明白为什么。

1>------ 构建开始: 项目: FirstGoogleTest, 配置: 调试 Win32 ------ 2>------ 构建开始: 项目: googleTest, 配置: 调试 Win32 ------ 1> MyMultiplier.cpp

2> gtest_main.cc
1> main.cpp

1> 生成代码...
2> gtest-all.cc
1> FirstGoogleTest.vcxproj -> D:_Vault\Workspaces\UnitTestLearning\FirstGoogleTest\Debug\FirstGoogleTest.exe
2> 生成代码...
2> googleTest.vcxproj -> D:_Vault\Workspaces\UnitTestLearning\FirstGoogleTest\Debug\googleTest.lib 3>------ 构建开始:项目:MyMultiplier_UnitLevelTest,配置:调试 Win32 ------ 3> MyMultiplier_UnitLevelTest.cpp


3>MyMultiplier_UnitLevelTest.obj:错误 LNK2019:未解析的外部符号“public:未签名的 int __thiscall
MyMultiplier::multiply(unsigned int,unsigned int)“ (?multiply@MyMultiplier@@QAEIII@Z) 在函数”private: virtual void __thiscall MyMultiplier_multiplyNormalSmallValues_Test::TestBody(void)“(?TestBody@MyMultiplier_multiplyNormalSmallValues_Test@@EAEXXZ)
3>D:_Vault\Workspaces\UnitTestLearning\FirstGoogleTest\Debug\MyMultiplier_UnitLevelTest.exe:致命错误 LNK1120:1 个未解析的
外部 ========== 生成:2 个成功,1 个失败,0 个最新,0 个跳过 ==========

解决方案结构如下:
https://www.dropbox.com/s/0cu8eqr7pz3ajaz/Untitled.png

ULT 项目的“参考”项目包括“googleTest”和“FirstGoogleTest”。 这是“MyMultiplier_UnitLevelTest.cpp”

#include "gtest/gtest.h"  // access test macro
#include "MyMultiplier.h"   // testee
#include <iostream>
#include <string>

TEST(MyMultiplier, multiplyNormalSmallValues){
    MyMultiplier m;
    std::string name("MyMultiplier_ULT");
    unsigned int a = 5;
    unsigned int b = 10;
    unsigned int answer = m.multiply(a, b/*, name*/);
    ASSERT_EQ(a * b, answer);

}

MyMultiplier.h 中“multiply”函数的声明:

class MyMultiplier{
public:
    unsigned int multiply(unsigned int a, unsigned int b/*, std::string& name*/);
};

签名匹配,并且还包含头文件。为什么 ULT 项目找不到符号?

整个解决方案可以在这里下载:https://www.dropbox.com/sh/vc89o5ep139wkuk/AAA8Z76q6iAkP25zTmu9bR3ia

C++ 可视化工作室 2013 GoogleTest 未解析外部

评论

1赞 cageman 8/16/2014
项目之间的链接是否正确?即您应该链接到.vcxProj中的 .lib
0赞 Solti 8/16/2014
这是手动步骤吗?我没有手动链接项目,并假设这是 Visual Studio 会做的事情。我确实将 ULT 项目的引用添加到其他项目中。

答:

1赞 KnightsValour 8/16/2014 #1

添加 .lib 文件的依赖项是 Visual Studio 中的手动步骤。

  1. 通过右键单击解决方案资源管理器中的项目(在本例中为 MyMultiplier_UnitLevelTest)打开项目的“属性页”框
  2. 单击链接器文件夹
  3. 打开输入页面
  4. “其他依赖项”字段中添加任何必要的 .lib

更多信息可以在这里找到: http://msdn.microsoft.com/en-CA/library/ba1z7822.aspx

评论

0赞 Solti 8/16/2014
在这种情况下,丢失的 lib 文件是什么?该错误是指 MyMultiplier 中的乘法函数。但是 MyMultiplier 不是 lib 文件......
0赞 KnightsValour 8/16/2014
如何导出 FirstGoogleTest 和 googleTest 中的函数以供您在 MyMultiplier_UnitLevelTest 中使用?也许我误解了您的评论回复 - 但我认为您正在使用 .dll 并且已经生成了 .lib 文件。
0赞 Solti 8/16/2014
我关注了一个 Google Test 教程视频,其中 ULT 项目只需要做 (1) 将 FirstGoogleTest 和 GoogleTest 作为“参考”项目添加到 ULT 项目中 (2) 将 FirstGoogleTest 和 Google test 的目录路径添加到 ULT 项目的“Include Directories”属性<br>在教程视频中,它完全可以正常工作,但不适用于我的情况。
0赞 Solti 8/16/2014
事实证明,你的方向是对的。这是关于图书馆链接的东西。我需要将受测者项目类型更改为静态库才能解决问题。
0赞 KnightsValour 8/19/2014
啊,我明白了 - 没有意识到这一切都可以在一个步骤中完成。很高兴它对你有用。
20赞 Solti 8/16/2014 #2

根本原因是项目类型设置不正确。

在此示例中,有三个项目:

  1. FirstGoogleTest,即被测试者。要测试的类驻留在此处。
  2. googleTest,这是谷歌测试框架
  3. MyMultiplier_UnitLevelTest,这是包含测试的 ULT 项目。

根本原因是“FirstGoogleTest”项目的配置类型设置为 .exe,这与 ULT 项目相同。所以 ult 测试无法从“FirstGoogleTest”获取外部数据。将“FirstGoogleTest”配置类型更改为静态库 (.lib) 后。该解决方案可以正确编译,并且 ULT 运行良好。

评论

27赞 kinar 3/20/2017
这不是一个好的解决方案。它要求你测试的所有内容都是一个库。如果您正在测试可执行文件,该怎么办?您是否打算维护第二组项目文件,以将所有内容构建到仅用于单元测试的库中?
2赞 kinar 3/20/2017 #3

这里的问题是您没有在实际测试项目中包含 MyMultiplier.h/cpp。

将其添加到项目文件(右键单击,添加现有项并导航到文件)。

-1赞 Gustavitch 1/3/2018 #4

我遇到了同样的问题,当您想要一个独立的谷歌测试时,最简单的解决方案是链接gtest_main和 gtest。 可以将 Visual Studio 项目设置为“可执行文件”,然后与 gtest_main 和 gtest 链接。

0赞 tak333 6/17/2021 #5

我通过包含cpp文件解决了类似的问题(我创建了一个Visual Studio项目,用于使用Google测试我自己的类“数字”(.h + .cpp))

没用:

#include "pch.h"
#include "..\..\LAB2\Number.h"

class TestLab2 : public ::testing::Test {
public:
    TestLab2() {
        Number n;
    }
}

工作:

#include "pch.h"
#include "..\..\LAB2\Number.h"
#include "..\..\LAB2\Number.cpp"

class TestLab2 : public ::testing::Test {
public:
    TestLab2() {
        Number n;
    }
}