我有一个项目与CMake,开发工具集-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路径和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 64中的libgcc和libstd++错误的
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007f60b47bf000)
libgcc_s.so.1 => /usr/lib64/libgcc_s.so.1 (0x00007f60b45a8000)怎么啦?
发布于 2019-07-26 22:25:29
这不是一个bug,而是一个特性!:) RH DevToolset并不仅仅是一个可供选择的编译器。libstdc++是一个LD脚本。二进制文件中的新C++11 (及以上)符号将通过静态库(专门构建并提供w/ DTS)进行解析。但是,旧的符号(存在于操作系统提供的libstdc++中)将被动态解析。这就是为什么ldd向您展示来自/usr/lib64的libstdc++!而且,默认情况下,它有旧的C++ ABI .使您的现代C++代码兼容w/旧libstdc++ DSO。
此特性允许您使用现代C++标准,并生成一个二进制文件,可以在原始OS (CentOS/RHEL) w/o中执行任何额外的“可再发行”共享库。
JFYI,如果您使用strip,请确保您使用它来自DTS和,而不是“本机”的一个(从操作系统以binutils自带)!否则,really bad things can happen。
https://stackoverflow.com/questions/57215604
复制相似问题