gpt4 book ai didi

c++ - 将使用 ExternalProject_Add 构建的库链接到使用 CMAKE_CXX_COMPILER 配置的项目时出错

转载 作者:太空狗 更新时间:2023-10-29 23:10:35 27 4
gpt4 key购买 nike

我的 CMake 项目使用了我使用 ExternalProject 模块添加的 gtest 库。这通常有效,但是当我将项目配置为使用 Clang 3.8 工具链时,例如:

cmake -DCMAKE_CXX_COMPILER=clang++-3.8 ..
cmake --build .

我在 Ubuntu 16.04 下收到以下链接器错误:

../lib/libgtest.a(gtest-all.cc.o): In function `testing::Message::Message()':
gtest-all.cc:(.text+0x2194): undefined reference to `std::__cxx11::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >::basic_stringstream()'
../lib/libgtest.a(gtest-all.cc.o): In function `testing::internal::edit_distance::CreateUnifiedDiff(std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&, unsigned long)':
gtest-all.cc:(.text+0x3596): undefined reference to `std::__cxx11::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >::basic_stringstream()'
../lib/libgtest.a(gtest-all.cc.o): In function `testing::internal::WideStringToUtf8[abi:cxx11](wchar_t const*, int)':
gtest-all.cc:(.text+0x53d7): undefined reference to `std::__cxx11::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >::basic_stringstream()'
../lib/libgtest.a(gtest-all.cc.o): In function `testing::internal::String::FormatIntWidth2[abi:cxx11](int)':
gtest-all.cc:(.text+0x59f8): undefined reference to `std::__cxx11::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >::basic_stringstream()'
../lib/libgtest.a(gtest-all.cc.o): In function `testing::internal::String::FormatHexInt[abi:cxx11](int)':
gtest-all.cc:(.text+0x5ac4): undefined reference to `std::__cxx11::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >::basic_stringstream()'
../lib/libgtest.a(gtest-all.cc.o):gtest-all.cc:(.text+0x5b80): more undefined references to `std::__cxx11::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >::basic_stringstream()' follow
clang: error: linker command failed with exit code 1 (use -v to see invocation)

问题似乎是 gtest 是使用系统级编译器 GCC 5 构建的,并且忽略了 CMAKE_CXX_COMPILER。确保使用相同工具链构建所有依赖项的正确方法是什么?

最佳答案

您可以将 CMAKE_CXX_COMPILER 值传递给 CONFIGURE_COMMAND 参数中的 ExternalProject_Add,但这不可扩展。您还可以设置 _GLIBCXX_USE_CXX11_ABI 标志来避免这种特定的标准库不匹配——但同样——这是一个脆弱的解决方案。

最终,您希望在整个项目中针对任何给定配置使用相同的编译器。执行此操作的最佳方法是使用环境变量 CXX 指定编译器,而不是通过 CMake 变量 CMAKE_CXX_COMPILER:

export CXX=clang++-3.8
cmake ..
cmake --build .

请注意,CXX 需要为配置命令和构建命令设置,因此如果您不想因更改为 CXX 而污染环境,为这两个命令添加前缀:

CXX=clang++-3.8 cmake ..
CXX=clang++-3.8 cmake --build .

(更好的是,使用包管理器,例如 ConanVcpkg!)

关于c++ - 将使用 ExternalProject_Add 构建的库链接到使用 CMAKE_CXX_COMPILER 配置的项目时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56653016/

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