当我尝试构建googletest(和googlemock)1.8.0时,当我尝试链接libgtest.a时,我得到一个未定义的MakeAndRegisterTestInfo引用。它与版本1.7.0配合使用,具有相同的cmake / make设置。我想我可以使用1.7.0然后我需要单独下载和构建gmock。
CMakeFiles/unittest.dir/test/test_led.cpp.o: In function `__static_initialization_and_destruction_0(int, int)':
test_led.cpp:(.text+0x23d): undefined reference to `testing::internal::MakeAndRegisterTestInfo(char const*, char const*, char const*, char const*, void const*, void (*)(), void (*)(), testing::internal::TestFactoryBase*)'
collect2: error: ld returned 1 exit status
make[2]: *** [bin/unittest] Error 1
make[1]: *** [CMakeFiles/unittest.dir/all] Error 2
make[1]: *** Waiting for unfinished jobs....
libgtest.a中的其他符号工作得很好(例如:: testing :: InitGoogleTest)但是一旦我尝试使用宏TEST_F添加测试,我就会收到此错误。
这是我的测试用例设置:
#include "gtest/gtest.h"
namespace {
// The fixture for testing (used by TEST_F).
class Foo : public ::testing::Test {
protected:
Foo();
virtual ~Foo() {};
virtual void SetUp();
virtual void TearDown();
};
Foo::Foo() {
};
void Foo::SetUp()
{
};
void Foo::TearDown()
{
};
TEST_F(Foo, Init) {
};
} // namespace
int main(int argc, char **argv)
{
::testing::InitGoogleTest(&argc, argv);
int ret = RUN_ALL_TESTS();
return ret;
}
Cmake google test snippet: 它从本地文件夹下载。它构建并获得libgtest.a文件。
### Unit test ###
# Google test
ExternalProject_Add(EXT_googletest
PREFIX ${CMAKE_CURRENT_BINARY_DIR}
DOWNLOAD_COMMAND ""
SOURCE_DIR ${CMAKE_SOURCE_DIR}/../external/googletest
BUILD_COMMAND make all
# Disable install step
INSTALL_COMMAND "")
# Create a libgtest target to be used as a dependency by test programs
set(LIBGTEST_STATIC ${CMAKE_CURRENT_BINARY_DIR}/.../googlemock/gtest/libgtest.a)
add_executable(unittest
"test/test_foo.cpp")
target_link_libraries(unittest main_app_lib
${LIBGTEST_STATIC}
${CMAKE_THREAD_LIBS_INIT})
NM输出libgtest.a 1.8.0
user@system$ nm .../libgtest.a |grep MakeAndRegisterTestInfo
000000000000743a T _ZN7testing8internal23MakeAndRegisterTestInfoEPKcS2_S2_S2_NS0_12CodeLocationEPKvPFvvES7_PNS0_15TestFactoryBaseE
NM输出libgtest.a 1.7.0(工作文件)
user@system$ nm .../libgtest.a |grep MakeAndRegisterTestInfo
0000000000005968 T _ZN7testing8internal23MakeAndRegisterTestInfoEPKcS2_S2_S2_PKvPFvvES6_PNS0_15TestFactoryBaseE
解决:
在构建计算机上安装了旧版本的google test,其中标题由cmake使用。
答案 0 :(得分:0)
@ user1178014回答了他自己的问题,但由于没有发布的答案,我正在写下来:
如果您直接下载了gtest源并使用了下载的gtest存储库中的make install
,则可能已在/usr/local/include/gtest
下安装了头文件。如果您稍后使用apt-get
安装libgtest-dev
debian软件包,则会在/usr/include/gtest
下安装头文件。如果从debian软件包安装的版本较新,您的Makefile可以从/usr/include
中获取较旧的头文件,即使您已经出现链接错误
正确链接新的libgtest.a
存档。
解决方案是查找/usr/local/include/gtest
和/usr/include/gtest
以查看它们是否都存在。如果他们这样做,则删除旧目录。如果/usr/include/gtest
是旧目录,则可能需要卸载libgtest-dev
包来删除它。