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

被折叠的 条评论
为什么被折叠?



