c++ 与conan一起安装的gtest:未定义对“测试::内部::GetBoolAssertionFailureMessage”的引用

6l7fqoea  于 2022-12-15  发布在  其他
关注(0)|答案(2)|浏览(167)

我使用cmake来构建我的项目,并使用conan来安装Google Test作为依赖项:

文件名.txt

[requires]
gtest/1.7.0@lasote/stable

[generators]
cmake

[imports]
bin, *.dll -> ./build/bin
lib, *.dylib* -> ./build/bin

CMakeLists.文本文件

PROJECT(MyTestingExample)
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)

INCLUDE(conanbuildinfo.cmake)
CONAN_BASIC_SETUP()

ADD_EXECUTABLE(my_test test/my_test.cpp)
TARGET_LINK_LIBRARIES(my_test ${CONAN_LIBS})

测试/我的测试.cpp

#include <gtest/gtest.h>
#include <string>

TEST(MyTest, foobar) {
    std::string foo("foobar");
    std::string bar("foobar");
    ASSERT_STREQ(foo.c_str(), bar.c_str()); // working
    EXPECT_FALSE(false); // error
}

版本

$ conan install --build=missing
$ mkdir build && cd build
$ cmake .. && cmake --build .

我可以使用ASSERT_STREQ,但如果使用EXPECT_FALSE,则会出现意外错误:

my_test.cpp:(.text+0x1e1): undefined reference to `testing::internal::GetBoolAssertionFailureMessage[abi:cxx11](testing::AssertionResult const&, char const*, char const*, char const*)'
collect2: error: ld returned 1 exit status

我的配置有什么问题?

ar5n3qh5

ar5n3qh51#

问题是您正在使用默认设置(构建类型Release)安装conan依赖项:

$ conan install --build=missing
# equivalent to
$ conan install -s build_type=Release ... --build=missing

默认设置可在conan.conf文件中查看
然后,您将在nix系统中使用cmake,默认构建类型为Debug,这是一个单配置环境(与多配置调试/发布环境相反,如Visual Studio),因此当您执行以下操作时:

$ cmake .. && cmake --build .
# equivalent to
$ cmake .. -DCMAKE_BUILD_TYPE=Debug && cmake --build .

调试/发布版本的不兼容性导致了这个未解决的问题。因此解决方案是使用与您安装的依赖项匹配的相同版本类型:

$ cmake .. -DCMAKE_BUILD_TYPE=Release && cmake --build .

如果使用多配置环境(如Visual Studio),正确的方法是:

$ cmake .. && cmake --build . --config Release
zazmityj

zazmityj2#

在我这边,我得到这个问题是因为在Redhat 7上,然后与一个旧的libstdc++。太旧的conan默认包二进制/库。
我已经通过使用'--build gtest' arg重新构建gtest修复了这个问题。

相关问题