gpt4 book ai didi

makefile - 与 googletest 链接时 undefined reference

转载 作者:行者123 更新时间:2023-12-02 22:11:33 29 4
gpt4 key购买 nike

当我尝试构建 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 谷歌测试片段:它从本地文件夹下载。它构建并得到一个 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,其 header 由 cmake 使用。

最佳答案

@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 链接时 undefined reference ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39207940/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com