Chinaunix首页 | 论坛 | 博客
  • 博客访问: 762875
  • 博文数量: 131
  • 博客积分: 13237
  • 博客等级: 上将
  • 技术积分: 1347
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-07 15:40
个人简介

哥已经隐退,不问江湖之事

文章分类

全部博文(131)

文章存档

2015年(1)

2014年(3)

2013年(11)

2012年(12)

2011年(9)

2010年(27)

2009年(8)

2008年(14)

2007年(7)

2006年(39)

分类: C/C++

2011-11-28 11:25:46

gtest是google开发的一个单元测试框架
在windows平台,gtest官方只提供两种编译方式:1、VS2005的工程文件;2、cygwin下使用autoconfig
对于使用纯windows版本gcc作为核心编译器的Dev C++或者Code::Block这些开发环境来说,gtest无法直接使用

我尝试过使用VS和cygwin编译出来的gtest库文件用于Dev C++(自带MinGW3.4.2),结果都是链接错误。随后便尝试使用Dev C++来手工编译gtest本身

准备工作:
将gtest的整个src和include目录拷贝到你的工作目录

编译过程:
  1. 首先你要明确一个概念,gtest有两个库,一个是含有main函数的,一个是不含有main函数的,两者互斥,所以我们需要建立两个工程,分别编译出两个库文件出来
  2. 首先建立gtest工程,工程的类型一定要是“静态库”。把src中除了gtest_main.cc和gtest-all.cc以外的所有文件都加入,然后注意在工程属性里面加入库文件路径,路径要求是工程目录本身、src目录、include目录,共三者
  3. 编译的话,有一个文件会报错,我们主要就是hack这里:
    gtest.cc   808行 (这个行数有可能不准)
    struct timeval now;  这个结构
    它使用了一个函数 gettimeofday(&now, NULL);
    MinGW没有这个函数,出错就在这里
    我使用了一种方法把它替换掉,来源于此
    这个方法修改后的结果:
    1. struct timeval now;
    2.     FILETIME ft;
    3.   long long *time64 = (long long *) &ft;

    4.   GetSystemTimeAsFileTime (&ft);

    5.   /* Convert from 100s of nanoseconds since 1601-01-01
    6.    * to Unix epoch.
    7.    */
    8.   *time64 -= 116444736000000000LL;
    9.   *time64 /= 10;

    10.   now.tv_sec = *time64 / 1000000;
    11.   now.tv_usec = *time64 % 1000000;
    12. // gettimeofday(&now, NULL);
    13.   return static_cast<TimeInMillis>(now.tv_sec) * 1000 + now.tv_usec / 1000;
    修改过后,所有的源文件就可以无错编译了,一切按照默认的静态库工程模式编译,就可以生成一个gtest.a的库文件了
  4. 在原有工程基础之上,加入gtest_main.cc文件,然后将工程另存为gtest_main工程,这个就是另外一个库了。因为gtest.cc文件已经改过了,所以现在这个新工程可以直接正常编译成功,生成一个gtest_main.a的库文件
  5. OK,现在你就得到了两个gtest的库文件,一个用于自带main函数的测试用例,一个用于没有自带main函数的测试用例。新建一个Dev C++工程,类型是控制台程序加入gtest官方自带的sample1例子,三个源文件。然后把gtest的include路径包含到该工程属性里面,另外在 工程选项->参数->链接器 里面加入gtest_main.a库文件,因为sample1是不自带main函数的
    OK,现在我们可以编译该工程,就生成了一个sample1.exe的可执行文件,打开一个DOS窗口,运行它,就可以验证我们工作的结果了
    1. C:\Users\zachary>F:\C\gtest\sample1.exe
    2. Running main() from gtest_main.cc
    3. [==========] Running 6 tests from 2 test cases.
    4. [----------] Global test environment set-up.
    5. [----------] 3 tests from FactorialTest
    6. [ RUN ] FactorialTest.Negative
    7. [ OK ] FactorialTest.Negative (0 ms)
    8. [ RUN ] FactorialTest.Zero
    9. [ OK ] FactorialTest.Zero (0 ms)
    10. [ RUN ] FactorialTest.Positive
    11. [ OK ] FactorialTest.Positive (0 ms)
    12. [----------] 3 tests from FactorialTest (6 ms total)

    13. [----------] 3 tests from IsPrimeTest
    14. [ RUN ] IsPrimeTest.Negative
    15. [ OK ] IsPrimeTest.Negative (0 ms)
    16. [ RUN ] IsPrimeTest.Trivial
    17. [ OK ] IsPrimeTest.Trivial (0 ms)
    18. [ RUN ] IsPrimeTest.Positive
    19. [ OK ] IsPrimeTest.Positive (0 ms)
    20. [----------] 3 tests from IsPrimeTest (6 ms total)

    21. [----------] Global test environment tear-down
    22. [==========] 6 tests from 2 test cases ran. (18 ms total)
    23. [ PASSED ] 6 tests.

    24. C:\Users\zachary>gcc -v
    25. Reading specs from C:/Dev-Cpp/bin/../lib/gcc/mingw32/3.4.2/specs
    26. Configured with: ../gcc/configure --with-gcc --with-gnu-ld --with-gnu-as --host=
    27. mingw32 --target=mingw32 --prefix=/mingw --enable-threads --disable-nls --enable
    28. -languages=c,c++,f77,ada,objc,java --disable-win32-registry --disable-shared --e
    29. nable-sjlj-exceptions --enable-libgcj --disable-java-awt --without-x --enable-ja
    30. va-gc=boehm --disable-libgcj-debug --enable-interpreter --enable-hash-synchroniz
    31. ation --enable-libstdcxx-debug
    32. Thread model: win32
    33. gcc version 3.4.2 (mingw-special)
  6. 以后在Dev C++中使用gtest,就是注意两点:
    1、需要加入gtest的include目录
    2、加入你需要的那个.a库文件
阅读(3725) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~