【问题标题】:How to set up Google C++ Testing Framework (gtest) with Visual Studio 2005如何使用 Visual Studio 2005 设置 Google C++ 测试框架 (gtest)
【发布时间】:2010-10-06 15:01:47
【问题描述】:

网站上没有记录,人们似乎在设置框架时遇到了问题。有人可以展示示例项目设置的分步介绍吗?

【问题讨论】:

  • 很高兴有人问...

标签: c++ visual-studio unit-testing visual-studio-2005 googletest


【解决方案1】:

(这些说明使测试框架适用于 Debug 配置。将相同的过程应用于 Release 配置应该很简单。)

获取 Google C++ 测试框架

  1. 下载最新gtest framework
  2. 解压到C:\gtest

构建框架库

  1. 在 Visual Studio 中打开 C:\gtest\msvc\gtest.sln
  2. 将配置设置为“调试”
  3. 构建解决方案

创建和配置您的测试项目

  1. 新建解决方案并选择模板 Visual C++ > Win32 > Win32 Console Application
  2. 右键单击新创建的项目并选择属性
  3. 将配置更改为调试。
  4. 配置属性 > C/C++ > 常规 > 附加包含目录:添加C:\gtest\include
  5. 配置属性 > C/C++ > 代码生成 > 运行时库:如果您的代码链接到运行时 DLL,请选择多线程调试 DLL (/MDd)。如果没有,请选择多线程调试 (/MTd)。
  6. 配置属性 > 链接器 > 常规 > 其他库目录:添加 C:\gtest\msvc\gtest\DebugC:\gtest\msvc\gtest-md\Debug,具体取决于 gtestd.lib 的位置
  7. 配置属性>链接器>输入>附加依赖:添加gtestd.lib

验证一切正常

  1. 在包含 main() 函数的测试项目中打开 cpp。
  2. 粘贴以下代码:

    #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
    }
    
  3. 调试 > 开始调试

如果一切正常,您应该会看到控制台窗口出现并显示单元测试结果。

【讨论】:

  • 那是一个很棒的指南!我能够让球滚动,但我会在其中添加一个注释:测试项目和 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,这就是我所做的:

    1. 将\mypath\gtest-1.0.1\Debug(或Release)添加到Common Properties->Linker->General->Additional Library Directories
    2. 将 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 测试库默认使用多线程或多线程调试运行时。

      所以,为谷歌测试库选择合适的运行时库类型。 (在配置属性 -> 代码生成 -> 运行时库中)。

      【讨论】:

      • 什么是合适的运行时? (医学博士或其他)
      猜你喜欢
      • 2011-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-05
      • 2010-10-28
      • 1970-01-01
      • 2020-03-19
      • 2011-06-30
      相关资源
      最近更新 更多