如何使用 Visual Studio 2005 设置 Google C++ 测试框架 (gtest)
Posted
技术标签:
【中文标题】如何使用 Visual Studio 2005 设置 Google C++ 测试框架 (gtest)【英文标题】:How to set up Google C++ Testing Framework (gtest) with Visual Studio 2005 【发布时间】:2010-10-06 15:01:47 【问题描述】:网站上没有记录,人们似乎在设置框架时遇到了问题。有人可以展示示例项目设置的分步介绍吗?
【问题讨论】:
很高兴有人问... 【参考方案1】:(这些说明使测试框架适用于 Debug 配置。将相同的过程应用于 Release 配置应该很简单。)
获取 Google C++ 测试框架
-
下载最新gtest framework
解压到
C:\gtest
构建框架库
-
在 Visual Studio 中打开
C:\gtest\msvc\gtest.sln
将配置设置为“调试”
构建解决方案
创建和配置您的测试项目
-
新建解决方案并选择模板 Visual C++ > Win32 > Win32 Console Application
右键单击新创建的项目并选择属性
将配置更改为调试。
配置属性 > C/C++ > 常规 > 附加包含目录:添加
C:\gtest\include
配置属性 > C/C++ > 代码生成 > 运行时库:如果您的代码链接到运行时 DLL,请选择多线程调试 DLL (/MDd)。如果没有,请选择多线程调试 (/MTd)。
配置属性 > 链接器 > 常规 > 其他库目录:添加 C:\gtest\msvc\gtest\Debug
或 C:\gtest\msvc\gtest-md\Debug
,具体取决于 gtestd.lib 的位置
配置属性>链接器>输入>附加依赖:添加gtestd.lib
验证一切正常
-
在包含
main()
函数的测试项目中打开 cpp。
粘贴以下代码:
#include "stdafx.h"
#include <iostream>
#include "gtest/gtest.h"
TEST(sample_test_case, sample_test)
EXPECT_EQ(1, 1);
int main(int argc, char** argv)
testing::InitGoogleTest(&argc, argv);
RUN_ALL_TESTS();
std::getchar(); // keep console window open until Return keystroke
调试 > 开始调试
如果一切正常,您应该会看到控制台窗口出现并显示单元测试结果。
【讨论】:
那是一个很棒的指南!我能够让球滚动,但我会在其中添加一个注释:测试项目和 gtest 库必须使用相同的代码生成选项构建,要么都是 /MDd 要么都是 /MTd,否则会有是一堆链接错误。 注意:无论谁尝试使用 Microsoft Visual Studio .Net 2003 执行此类似的实现,Google 测试框架库都会自动将运行时库默认设置为“Single” -threaded Debug' 用于调试模式和 'Single-threaded' 用于发布模式,据我尝试,从代码生成中更改它的选项不可用。因此,请确保在项目中选择单线程选项作为运行时库。除此之外,这个简单而简短的教程非常完美! 这是五个有效的教程中的第一个,并且没有推广不好的做法。如果这涵盖了将测试项目链接到原始项目的重要方面,我会很高兴...... 30 多个站点之后,我还没有找到有效的答案。我花了 3 天时间。 我在“项目属性 > 配置属性 > C/C++ > 运行时库”中删除了值,然后它工作了【参考方案2】:Arlaharen 所说的基本上是正确的,只是他省略了解释链接器错误的部分。首先,您需要构建您的应用程序没有 CRT 作为运行时库。无论如何,您应该始终这样做,因为它确实简化了您的应用程序的分发。如果您不这样做,那么您的所有用户都需要安装 Visual C++ 运行时库,而那些不这样做的用户会抱怨他们的系统上缺少神秘的 DLL……因为链接需要额外的几百 KB静态 CRT,您可以在以后获得支持时省去很多麻烦(相信我,我已经通过艰难的方式学会了它!)。
无论如何,要做到这一点,你去目标的属性 -> C/C++ -> 代码生成 -> 运行时库,它需要为你的发布版本设置为“多线程”和“多线程” Debug”为您的调试版本。
由于 gtest 库是以相同的方式构建的,因此您需要确保链接到正确版本的 it,否则链接器将拉入运行时库的另一个副本,这是您看到的错误(顺便说一句,无论您是否使用 MFC,这都不应该有所作为)。您需要将 gtest 构建为 Debug 和 Release 模式并保留两个副本。然后,您在 Release 构建中链接 gtest.lib/gtest_main.lib,在 Debug 构建中链接 gtestd.lib/gtest_maind.lib。
此外,您需要确保您的应用程序指向存储 gtest 头文件的目录(在属性 -> C/C++ -> 常规 -> 附加包含目录中),但如果遇到链接器错误,我假设您已经设法使这部分正确,否则您首先要处理更多的编译器错误。
【讨论】:
我花了一整天的时间才学会了这一点。在以相同的方式构建它们之后,我终于让它工作了。谢谢你的回答,但已经晚了。 :/ 顺便说一句,你的 CRT 建议是错误的,但我没有足够的空间来讨论这个。见tinyurl.com/dj5k7k 好吧,如果您以“艰难的方式”学习它,您可能会忘记 CRT 运行时 dll 被称为“可再分发”...所以很明显您必须自己重新分发它们...要么通过在您自己的安装程序中包含 redist 安装程序,或者只需在您自己的安装文件夹中提取所需的 dll...(如果需要,包括清单文件) 静态链接 CRT 意味着您的应用程序不会获取漏洞利用/安全修复程序【参考方案3】:我做了一个关于设置的视频教程: http://www.youtube.com/watch?v=mzSzwQOmMRs
【讨论】:
【参考方案4】:构建了 gtest,这就是我所做的:
-
将\mypath\gtest-1.0.1\Debug(或Release)添加到Common Properties->Linker->General->Additional Library Directories
将 gtest.lib 和 gtest_main.lib 添加到 Common Properties->Linker->Input->Additional Dependencies
之后,我只是根据需要使用 TEST 或 TEST_F 编写测试,并将它们与我的 main 函数一起编译:
int main(int argc, char** argv)
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
【讨论】:
我收到很多链接器错误:已在 gtest.lib 中定义... 例如:1>LIBCMT.lib(tidtable.obj):错误 LNK2005:__encode_pointer 已在 msvcrt.lib(MSVCR80 .dll) 哦,顺便说一句,我正在尝试为 MFC 代码编写测试。 对不起。我不认为我可以在那里帮助你。出于某种原因,我没有收到那些链接错误。您是否尝试过使用 gtest 构建一个 hello world 测试?gtest_main.lib
包含默认的main
函数,因此如果您明确编写了自己的main
,您可能不想包含它。【参考方案5】:
如果您不想编写自己的 main() 进行测试,您可以使用 gtest_main.lib 中定义的 main() 函数,但在 VS2012 中会出现链接器错误“必须定义入口点”。 在您的测试项目中,将 ProjectProperties->Linker->System->SubSystem 设置为“Console”,因为这将强制 VS2012 寻找一个名为“main()”的入口点,并将在 gtest_main.lib 中找到它(前提是您已链接它正确)。
【讨论】:
【参考方案6】:在 Microsoft Visual Studio 中,错误配置的运行时库类型会导致链接错误。
VS 2005(和 2008)默认使用多线程 DLL 或多线程调试 DLL。 但 Google 测试库默认使用多线程或多线程调试运行时。
所以,为谷歌测试库选择合适的运行时库类型。 (在配置属性 -> 代码生成 -> 运行时库中)。
【讨论】:
什么是合适的运行时? (医学博士或其他)以上是关于如何使用 Visual Studio 2005 设置 Google C++ 测试框架 (gtest)的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Visual Studio 2005 根据架构验证 XML 文件
如何在 Visual Studio 2005 中进行单元测试?
如何让Visual Studio 2008编辑SSRS 2005报表项目没有安装SQL Business Intelligence Development Studio 2005?