如何使用 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\DebugC:\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?

visual studio 2005 图像上 添加 数字

如何在 Visual Studio 2005 中抑制单个 BizTalk 警告

如何在 Visual Studio 2005 中禁止警告 4200?