提问人:Solti 提问时间:8/16/2014 更新时间:6/17/2021 访问量:25315
Google 测试:错误 LNK2019:Visual Studio 2013 无法解析的外部符号
Google Test: error LNK2019: unresolved external symbol with Visual Studio 2013
问:
我正在尝试使用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
答:
添加 .lib 文件的依赖项是 Visual Studio 中的手动步骤。
- 通过右键单击解决方案资源管理器中的项目(在本例中为 MyMultiplier_UnitLevelTest)打开项目的“属性页”框
- 单击链接器文件夹
- 打开输入页面
- 在“其他依赖项”字段中添加任何必要的 .lib
更多信息可以在这里找到: http://msdn.microsoft.com/en-CA/library/ba1z7822.aspx
评论
根本原因是项目类型设置不正确。
在此示例中,有三个项目:
- FirstGoogleTest,即被测试者。要测试的类驻留在此处。
- googleTest,这是谷歌测试框架
- MyMultiplier_UnitLevelTest,这是包含测试的 ULT 项目。
根本原因是“FirstGoogleTest”项目的配置类型设置为 .exe,这与 ULT 项目相同。所以 ult 测试无法从“FirstGoogleTest”获取外部数据。将“FirstGoogleTest”配置类型更改为静态库 (.lib) 后。该解决方案可以正确编译,并且 ULT 运行良好。
评论
这里的问题是您没有在实际测试项目中包含 MyMultiplier.h/cpp。
将其添加到项目文件(右键单击,添加现有项并导航到文件)。
我遇到了同样的问题,当您想要一个独立的谷歌测试时,最简单的解决方案是链接gtest_main和 gtest。 可以将 Visual Studio 项目设置为“可执行文件”,然后与 gtest_main 和 gtest 链接。
我通过包含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;
}
}
评论