CMake 使用来自 devtoolset 的 gcc,但链接到错误的 libgcc 和 libstd++

CMake uses gcc from devtoolset but links against wrong libgcc and libstd++

我有一个安装了 CMake、devtoolset-6 和标准 gcc 4.8.2 的项目。 CMake 正确找到正确的 gcc:

-- The C compiler identification is GNU 6.2.1
-- The CXX compiler identification is GNU 6.2.1
-- Check for working C compiler: /opt/rh/devtoolset-6/root/usr/bin/cc
-- Check for working C compiler: /opt/rh/devtoolset-6/root/usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /opt/rh/devtoolset-6/root/usr/bin/c++
-- Check for working CXX compiler: /opt/rh/devtoolset-6/root/usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done

PATH 和 LD_LIBRARY_PATH 已设置

echo $PATH
/opt/rh/devtoolset-6/root/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
echo $LD_LIBRARY_PATH
/opt/rh/devtoolset-6/root/usr/lib64:/opt/rh/devtoolset-6/root/usr/lib

该项目构建正确,但针对 /usr/lib64

中的错误 libgcc 和 libstd++
  libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007f60b47bf000)
  libgcc_s.so.1 => /usr/lib64/libgcc_s.so.1 (0x00007f60b45a8000)

怎么了?

这不是错误,而是功能! :) RH DevToolset 不仅仅是一个内置的替代编译器。它的 libstdc++ 是一个 LD 脚本。二进制文件中的新 C++11(及更高版本)符号将通过 static 库(专​​门构建并随 DTS 一起提供)解析。但是,旧符号(存在于 OS 的 libstdc++ 中)将被动态解析。这就是为什么 ldd 显示 libstdc++ 来自 /usr/lib64!此外,它默认具有 Old C++ ABI... 使您的现代 C++ 代码与旧 libstdc++ DSO 兼容。

此功能允许您使用现代 C++ 标准,并生成可以在原始 OS (CentOS/RHEL) w/o 中执行的二进制文件"redistributable" 共享库.

仅供参考,如果您使用 strip,请确保您使用 DTS 而不是 而不是 "native" (在 binutils 中提供)来自 OS)!否则,.