如何使用Visual Studio 2005设置Google C ++测试框架(gtest)


Answers:


44

Arlaharen所说的基本上是正确的,只是他省略了解释您的链接器错误的部分。首先,您需要在没有CRT的情况下将应用程序构建为运行时库。无论如何,您始终应该这样做,因为它确实简化了应用程序的分发。如果您不这样做,那么所有用户都需要安装Visual C ++运行时库,而那些没有这样做的用户将抱怨系统上缺少神秘的DLL……这需要花几百千字节来链接静态地使用CRT,在以后的支持中您省去了很多麻烦(相信我,这是我的硬方法!)。

无论如何,要执行此操作,请转至目标的属性-> C / C ++->代码生成->运行时库,对于您的Release版本,需要将其设置为“多线程”,对于目标版本,则需要将其设置为“多线程调试”您的调试版本。

由于gtest库是以相同的方式构建的,因此您需要确保链接到的正确版本,否则链接器将提取运行时库的另一个副本,这就是您看到的错误(顺便说一句,如果您使用的是MFC,则不会有任何区别)。您需要将gtest构建为Debug和Release模式,并保留两个副本。然后,在Release版本中链接gtest.lib / gtest_main.lib,在Debug版本中链接gtestd.lib / gtest_maind.lib。

另外,您需要确保您的应用程序指向存储gtest头文件的目录(在属性-> C / C ++->常规->其他包含目录中),但是如果遇到链接器错误,我认为您已经设法使这一部分正确,否则首先会有更多编译器错误需要处理。


我整天都在学习这种“艰难的方式”。最终,在以相同的方式构建它们两个之后,我开始工作了。谢谢您的回答,但是已经晚了。:/顺便说一句,您的CRT建议是错误的,但是我没有足够的空间来讨论这一点。看到tinyurl.com/dj5k7k
knaser

好吧,如果您以“艰难的方式”学习了它,那么您可能会忘记了CRT运行时dll被称为“可再分发” ...因此,很明显,您必须自己重新分发它们...通过将Redist安装程序包含在自己的安装程序中,或仅在您自己的安装文件夹中提取所需的dll ...(如果需要,包括清单文件)
smerlin 2010年

1
静态链接CRT意味着您的应用程序将不会获取漏洞利用/安全修复程序
paulm 2014年

106

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

获取Google C ++测试框架

  1. 下载最新版本 gtest框架
  2. 解压缩到 C:\gtest

建立框架库

  1. 打开 C:\gtest\msvc\gtest.sln在Visual Studio中
  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. 调试>开始调试

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


9
那是一个很好的指导!我能够解决问题,但是我还要在其中添加一个注释:测试项目和gtest库必须使用相同的代码生成选项构建,要么都是/ MDd,要么都是/ MTd,否则将会一堆链接错误。
Kiril

1
注意:无论谁尝试使用Microsoft Visual Studio .Net 2003进行这种类似的实现,Google Test Framework库都会自动将运行时库默认设置为“单线程调试”(对于调试模式)和“单线程”(对于发布模式),以及据我尝试,从代码生成更改它的选项不可用。因此,请确保选择“单线程”选项作为项目中的运行时库。除此之外,这个简单而简短的教程非常完美!
Neophile 2011年

这是五个有效且没有引起不良实践的教程中的第一个。如果它涵盖了将测试项目链接到原始项目的重要方面,我会很喜欢的。30多个站点之后,我没有找到有效的答案。我已经花了3天了。
person27年

我在“项目属性>配置属性> C / C ++>运行时库”中删除了值,然后它起作用了
Manohar Reddy Poreddy


5

构建了gtest之后,这就是我所做的:

  1. 将\ mypath \ gtest-1.0.1 \ Debug(或发行版)添加到Common Properties-> Linker-> General-> Additional Library Directories
  2. 将gtest.lib和gtest_main.lib添加到Common Properties-> Linker-> Input-> Additional Dependencies

之后,我只需要使用TEST或TEST_F编写测试,然后将其与主函数一起编译:

int main(int argc, char** argv)
{
    testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

5
我收到很多链接器错误:已在gtest.lib中定义...例如:1> LIBCMT.lib(tidtable.obj):错误LNK2005:msvcrt.lib(MSVCR80.dll)中已定义__encode_pointer哦,老兄,我正在尝试为MFC代码编写测试。
knaser

抱歉。我认为我无法为您提供帮助。由于某些原因,我没有得到那些链接错误。您是否尝试过使用gtest建立一个hello世界测试?
Arlaharen 2009年

gtest_main.lib包含默认main函数,因此如果您main明确编写自己的函数,则可能不希望包含它。
Groo

5

如果您不想编写自己的main()进行测试,则可以使用gtest_main.lib中定义的main()函数,但会在VS2012中收到链接器错误“必须定义入口点”。在测试项目中,将ProjectProperties-> Linker-> System-> SubSystem设置为“ Console”,因为这将强制VS2012查找名为“ main()”的入口点,并在gtest_main.lib中找到它(前提是已链接)它正确地)。


2

在Microsoft Visual Studio中,配置错误的运行时库类型会导致链接错误。

VS 2005(和2008)默认使用多线程DLL或多线程调试DLL。但是Google Test库默认使用Mulithreaded或Mulithreaded调试运行时。

因此,为Google测试库选择适当的运行时库类型。(在配置属性->代码生成->运行时库中)。


什么是合适的运行时?(MD或其他)
Ramadheer Singh's

0

许多错误,需要一段时间才能解决。

简单的步骤如下:

#从以下网址下载Googletest ZIP文件:https//github.com/google/googletest

#Googletest Visual Studio解决方案

Open    C:\googletest\googletest\msvc\2010\gtest.sln
    Change "Solution configuration"
        from "Debug" to "Release"
    Build Solution
        creates gtest.lib

#您的项目:

Project Properties > Configuration Properties > VC++ Directories > Include Directories
    append the following:       ;C:\googletest\googletest\include

Project Properties > Configuration Properties > Linker > General > Additional Library Directories > 
    append the following:           ;C:\googletest\googletest\msvc\2010\gtest\Win32-Release

Project Properties > Configuration Properties > C/C++ > Runtime Library
    Remove the value of the above. (or match it to Googletest project)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.