CMake使用devtoolset中的gcc,但是链接错误,libgcc和libstd++;
我有一个安装了CMake、devtoolset-6和standart gcc 4.8.2的项目。 CMake正确查找正确的gcc:CMake使用devtoolset中的gcc,但是链接错误,libgcc和libstd++;,gcc,cmake,devtoolset,Gcc,Cmake,Devtoolset,我有一个安装了CMake、devtoolset-6和standart 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
-- 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_库_路径
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)
怎么了?这不是一个bug,而是一个特性!:) RH DevToolset不仅仅是一个内置的替代编译器。它是
libstdc++
是一个LD脚本。二进制文件中新的C++11(及以上)符号将通过静态库(专门构建并附带DTS)解析。但是,旧符号(存在于操作系统附带的libstdc++
中)将被动态解析。这就是为什么ldd
从/usr/lib64
中显示libstdc++
!此外,它默认有旧的C++ ABI…使您的现代C++代码兼容W/ORD <代码> LBSTDC++< /COD> DSO .< /P>
此特性允许您使用现代C++标准,并生成一个二进制文件,该二进制文件可以在原始OS(CENTOS/RHEL)<强> W/O中执行任何附加的“可再分布”共享库>/P>
JFYI,如果您使用的是
strip
,请确保您使用的是DTS中的而不是操作系统中的binutils
中的“本机”!否则,。这不是一个bug,而是一个特性!:)
RH DevToolset不仅仅是一个内置的替代编译器。它是libstdc++
是一个LD脚本。二进制文件中新的C++11(及以上)符号将通过静态库(专门构建并附带DTS)解析。但是,旧符号(存在于操作系统附带的libstdc++
中)将被动态解析。这就是为什么ldd
从/usr/lib64
中显示libstdc++
!此外,它默认有旧的C++ ABI…使您的现代C++代码兼容W/ORD <代码> LBSTDC++< /COD> DSO .< /P>
此特性允许您使用现代C++标准,并生成一个二进制文件,该二进制文件可以在原始OS(CENTOS/RHEL)<强> W/O中执行任何附加的“可再分布”共享库>/P>
JFYI,如果您使用的是
strip
,请确保您使用的是DTS中的而不是操作系统中的binutils
中的“本机”!否则,.运行ldd时是否仍设置了LD\U LIBRARY\U路径?二进制是suid吗?实际上,在devtoolset-6/root/usr/lib64中是否有更新的libstdc++.so.6?我的理解是,他们使用system one,并与一些静态库链接以添加缺少的符号。这两个问题-是的,如果二进制文件是suid,那么LD_library_路径是无用的。您需要设置rpath,但正如我在更新的注释中所解释的,我认为这对于devtoolset不是必需的。在运行ldd时是否仍然设置了LD_LIBRARY_路径?二进制是suid吗?实际上,在devtoolset-6/root/usr/lib64中是否有更新的libstdc++.so.6?我的理解是,他们使用system one,并与一些静态库链接以添加缺少的符号。这两个问题-是的,如果二进制文件是suid,那么LD_library_路径是无用的。您可能需要设置rpath,但正如我在更新的注释中所解释的,我认为这对于devtoolset是不必要的。