当我尝试构建googletest(和googlemock)1.8.0时,当我尝试与libgtest.a链接时,得到了对MakeAndRegisterTestInfo的 undefined reference 。在具有相同cmake/make设置的1.7.0版中,它可以正常工作。我想我可以使用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测试代码段:
它从本地文件夹下载。它生成,我得到一个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使用了 header 。

最佳答案

@ 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软件包来将其删除。

关于makefile - 与googletest链接时未定义引用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39207940/

10-11 18:30