【问题标题】:Undefined reference when linking with googletest与 googletest 链接时未定义的引用
【发布时间】:2016-08-29 13:49:17
【问题描述】:

当我尝试构建 googletest(和 googlemock)1.8.0 时,当我尝试与 libgtest.a 链接时,我得到了对 MakeAndRegisterTestInfo 的未定义引用。它适用于具有相同 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 谷歌测试sn-p: 它从本地文件夹下载。它构建,我得到一个 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 测试,cmake 使用了这些标头。

【问题讨论】:

  • 你做过make clean 吗?
  • 我最近遇到了这个错误信息,这是因为我最近升级了 gtest 后没有在我的项目上运行make clean

标签: makefile cmake static-libraries googletest


【解决方案1】:

@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 包来删除它。

【讨论】:

  • 为我工作。应该遵循一种方法。
猜你喜欢
  • 1970-01-01
  • 2019-02-12
  • 1970-01-01
  • 2015-01-24
  • 2020-06-30
  • 1970-01-01
  • 2018-06-16
  • 2011-04-03
  • 2021-08-17
相关资源
最近更新 更多