测试自动化 2011-01-04 GTest

本文详细介绍了在Cygwin环境下执行GTest的步骤,并列举了遇到的6个问题,包括编译错误、未定义的引用、执行文件错误等,通过分析原因并给出解决方案,为GTest在Cygwin下的使用提供了参考。

GTest

 

1. 在Cygwin下面执行GTest示例程序

cd ${GTEST_HOME}/make

make

./sample1_unittest

 

$ ./sample1_unittest
Running main() from gtest_main.cc
[==========] Running 6 tests from 2 test cases.
[----------] Global test environment set-up.
[----------] 3 tests from FactorialTest
[ RUN      ] FactorialTest.Negative
[       OK ] FactorialTest.Negative (1 ms)
[ RUN      ] FactorialTest.Zero
[       OK ] FactorialTest.Zero (0 ms)
[ RUN      ] FactorialTest.Positive
[       OK ] FactorialTest.Positive (0 ms)
[----------] 3 tests from FactorialTest (10 ms total)

[----------] 3 tests from IsPrimeTest
[ RUN      ] IsPrimeTest.Negative
[       OK ] IsPrimeTest.Negative (0 ms)
[ RUN      ] IsPrimeTest.Trivial
[       OK ] IsPrimeTest.Trivial (0 ms)
[ RUN      ] IsPrimeTest.Positive
[       OK ] IsPrimeTest.Positive (0 ms)
[----------] 3 tests from IsPrimeTest (11 ms total)

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

 

2. 在Cygwin下执行第一个测试程序

* build gtest产生库libgtest.a

 

g++ -I${GTEST_DIR}/include -I${GTEST_DIR} -c ${GTEST_DIR}/src/gtest-all.cc
ar -rv libgtest.a gtest-all.o

 

* 程序

#include "gtest/gtest.h"

namspace
{
 class FooTest public ::testing::Test
 {
 //protected:
  FooTest() {}
  virtual ~FooTest() {}
  virtual void SetUp() {}
  virtual void TearDown() {}
 };
  
  TEST_F(FooTest, OneEqual) {
   EXPECT_EQ(0,0);
  }
  
  TEST_F(FooTest, OneEqual) {
   EXPECT_EQ(1,1);
  }
}

 

* 编译运行

1. 问题1

$ g++ -I./include try.cpp libgtest.a -otry
try.cpp:4: error: function definition does not declare parameters

 

 

$ g++ -I./include try.cpp libgtest.a -otry
try.cpp:19: error: redefinition of ‘class<unnamed>::FooTest_OneEqual_Test’
try.cpp:15: error: previous definition of ‘class<unnamed>::FooTest_OneEqual_Tes
t’
try.cpp:19: error: redefinition of ‘testing::TestInfo* const <unnamed>::FooTest
_OneEqual_Test::test_info_’
try.cpp:15: error: ‘testing::TestInfo* const <unnamed>::FooTest_OneEqual_Test::
test_info_’ previously declared here
try.cpp:19: error: redefinition of ‘void<unnamed>::FooTest_OneEqual_Test::TestB
ody()’
try.cpp:15: error: ‘virtual void<unnamed>::FooTest_OneEqual_Test::TestBody()’
previously defined here

 

原因:代码里OneEqual重复使用了

 

2. 问题2

$ g++ -I./include libgtest.a -otry
/usr/lib/gcc/i686-pc-cygwin/4.3.4/../../../libcygwin.a(libcmain.o):(.text+0xa9):
 undefined reference to `_WinMain@16'
collect2: ld returned 1 exit status

 

原因:g++缺少源代码 -c try.cpp

注意:解释不正确。-c 开关只和编译后无法执行有关(Cannot Execute Binary File )

 

3. 问题3

$ ./try
./try: ./try: cannot execute binary file

 

原因:-c的含义是不link,与Linux不一样

 

4. 问题4

一大堆未定义符号

 

$ g++ -I./include libgtest.a try.cpp -otry
/cygdrive/c/DOCUME~1/ADMINI~1/LOCALS~1/Temp/ccA77DJU.o:try.cpp:(.text+0xcb): und
efined reference to `testing::internal::MakeAndRegisterTestInfo(char const*, cha
r const*, char const*, char const*, void const*, void (*)(), void (*)(), testing
::internal::TestFactoryBase*)'
/cygdrive/c/DOCUME~1/ADMINI~1/LOCALS~1/Temp/ccA77DJU.o:try.cpp:(.text+0x127): un
defined reference to `testing::internal::MakeAndRegisterTestInfo(char const*, ch
ar const*, char const*, char const*, void const*, void (*)(), void (*)(), testin
g::internal::TestFactoryBase*)'

 

最后仍然有 undefined reference to _WinMain

 

原因:try.cpp与libgtest.a的顺序?

 

5. 问题5:

g++ -I./include try.cpp libgtest.a -otry -lm

 

$ g++ -I./include try.cpp libgtest.a -otry
/usr/lib/gcc/i686-pc-cygwin/4.3.4/../../../libcygwin.a(libcmain.o):(.text+0xa9):
 undefined reference to `_WinMain@16'
collect2: ld returned 1 exit status

 

原因:整个程序里没有WinMain。可能需要从库里找到有执行程序入口的包。

故把src/gtest_main.cc编译成gtest_main.o

 

6. 问题6

 

g++ -I./include try.cpp libgtest.a gtest_main.o -otry

 

libgtest.a(gtest_main.o):class_type_info.cc:(.idata+0x4a4): multiple definition
of `__imp___ZSt4cerr'
libgtest.a(gtest_main.o):class_type_info.cc:(.idata+0x4a4): first defined here
libgtest.a(gtest_main.o):cygming-crtend.c:(.data+0x0): multiple definition of `_
register_frame_info_ptr'
/usr/lib/gcc/i686-pc-cygwin/4.3.4/crtbegin.o:cygming-crtbegin.c:(.data+0x0): fir
st defined here
libgtest.a(gtest_main.o):class_type_info.cc:(.idata+0x4a8): multiple definition
of `__imp___ZSt4cout'
libgtest.a(gtest_main.o):class_type_info.cc:(.idata+0x4a8): first defined here
libgtest.a(gtest_main.o):class_type_info.cc:(.idata+0x4c4): multiple definition
of `__imp___ZTISt13runtime_error'
libgtest.a(gtest_main.o):class_type_info.cc:(.idata+0x4c4): first defined here
/usr/lib/gcc/i686-pc-cygwin/4.3.4/crtbegin.o:cygming-crtbegin.c:(.data+0x8): und
efined reference to `__Jv_RegisterClasses'
collect2: ld returned 1 exit status

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值