【问题标题】:GTest installed with Conan: undefined reference与柯南一起安装的 GTest:未定义的参考
【发布时间】:2017-06-28 22:57:59
【问题描述】:

我尝试使用通过柯南安装的 gtest,但最终出现未定义的引用链接器错误。这个问题或多或少是对this stackoverflow question 的跟进。但我认为提供的示例很简单。我使用 gcc 6.3 在最新的 arch linux x64 下编译。

会不会有一些 C++ 版本不匹配?或者您对如何解决问题有任何其他想法?

我将在下面提供我的源代码:

目录树:

tree
.
├── CMakeLists.txt
├── conanfile.txt
└── main.cpp

main.cpp:

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

class TestFixture : public ::testing::Test {
protected:
    void SetUp(){
    std::cout << "SetUp()" << std::endl;
    }

    void TearDown(){
    std::cout << "TearDown()" << std::endl;
    }
};



TEST_F (TestFixture, shouldCompile) {
    std::cout << "shouldCompile" << std::endl;
    ASSERT_TRUE(true); // works, maybe optimized out?
    ASSERT_TRUE("hi" == "hallo"); // undefined reference

}

int main(int argc, char **argv) {
    ::testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

CMakeLists.txt:

project(ConanGtestExample)
cmake_minimum_required(VERSION 2.8.12)

set(CMAKE_CXX_STANDARD 11)

include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
conan_basic_setup()

# Necessary to compile gtest
# - dependencies and final build
#   need to be compiled with same
#   build type. Otherwise linker
#   error will occure.
set(CMAKE_BUILD_TYPE Release)

add_executable(main main.cpp)
target_link_libraries(main ${CONAN_LIBS})

conanfile.txt:

[requires]
gtest/1.7.0@lasote/stable

[generators]
cmake

我尝试使用以下命令构建项目:

mkdir build
cd build
conan install -s build_type=Release .. --build=missing
cmake .. -DCMAKE_BUILD_TYPE=Release 
cmake --build .

未定义的参考输出:

Scanning dependencies of target main
[ 50%] Building CXX object CMakeFiles/main.dir/main.cpp.o
[100%] Linking CXX executable bin/main
CMakeFiles/main.dir/main.cpp.o: In function `TestFixture_shouldCompile_Test::TestBody()':
main.cpp:(.text+0x99): undefined reference to `testing::internal::GetBoolAssertionFailureMessage[abi:cxx11](testing::AssertionResult const&, char const*, char const*, char const*)'
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/main.dir/build.make:95: bin/main] Error 1
make[1]: *** [CMakeFiles/Makefile2:68: CMakeFiles/main.dir/all] Error 2
make: *** [Makefile:84: all] Error 2

【问题讨论】:

    标签: c++ cmake googletest conan


    【解决方案1】:

    我找到了问题的答案:

    问题是柯南确实下载/编译了 gtest 二进制文件 默认情况下使用libstdc++,即使我的编译器(gcc 6.3)使用 libstdc++11 默认情况下。因此libstdc++ 之间存在不匹配libstdc++11

    要解决此问题,您必须明确告诉柯南使用 libstdc++11 进行编译:

    conan install .. --build missing -s compiler=gcc -s compiler.version=6.3 -s compiler.libcxx=libstdc++11
    

    【讨论】:

    • 我正要回答,你快了几秒!事实上,柯南使用默认的libstdc++,您可以在&lt;home&gt;/.conan/conan.conf 中查看它,因为它提供了更广泛的兼容性。您可能想阅读blog.conan.io/2016/03/22/…。 TL;DR:使用libstdc++,您可以制作适用于大多数发行版的垃圾箱,甚至更旧的发行版,即使 gcc>5.1,它们也带有 libstdc++(不是 11)
    • 您也可以在配置文件中进行更改。您可以在~/.conan/profiles 中找到配置文件,您可以创建一个新配置文件,也可以更新默认配置文件。我需要的关键值是:compiler.libcxx=libstdc++11.
    【解决方案2】:

    我最终不得不在项目的conanfile.py 中添加self.options['gtest'].shared = True 来解决这个问题。以前,由于某些与 Windows 相关的原因变得无关紧要,它被设置为 false。

    如果像我一样,如果您看到默认设置已经是 libstdc++11,那么尝试更改为 gtest/gmock 的共享库,因此更改 conan install 参数是不够的。

    【讨论】:

    • 配置self.options['gtest'].shared = True 也适用于我的情况。之前我也配置了self.options['gtest'].shared == False,有些项目GCC失败了(只有一些我相信我配置的和其他成功项目一样的项目!),而MSVC和Clang没有这样的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 2023-02-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-15
    • 1970-01-01
    相关资源
    最近更新 更多