0

我有一个安装了 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)

怎么了?

4

1 回答 1

2

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

此功能允许您使用现代 C++ 标准,并生成可以在原始操作系统 (CentOS/RHEL) 中执行的二进制文件,而无需任何额外的“可再发行”共享库

JFYI,如果您使用strip,请确保您从 DTS 使用它,而不是使用“本机”binutils从操作系统提供)!否则,可能会发生非常糟糕的事情

于 2019-07-26T22:25:29.557 回答