一尘不染

将g ++ 4.8链接到libstdc ++

linux

我在运行64位Ubuntu 12.04的桌面上下载并构建了gcc 4.8.1。我像文档建议一样使用命令从源代码中构建它

../../gcc-4.8.1/configure --prefix=$HOME --program-suffix=-4.8
make
make -k check
make install

它似乎通过了所有测试,我将所有内容都安装到了带有后缀-4.8的主目录中,以区别于版本4.6.3的系统gcc。

不幸的是,当我使用g -4.8编译c 程序时,它链接到系统libc和libstdc
,而不是从gcc-4.8.1编译的较新的程序。我下载并构建了gcc 4.8,因为我想在标准库中使用C
11的新功能,所以这种行为绝对不是我想要的。如何使gcc-4.8自动链接到其随附的标准库而不是系统标准库?


阅读 228

收藏
2020-06-02

共1个答案

一尘不染

与自己的gcc链接时,您需要添加一个额外的运行时链接程序搜索路径,-Wl,-rpath,$(PREFIX)/lib64以便在运行时找到与您的gcc对应的共享库。

我通常在与我调用的目录相同的目录中创建一个包装器gcc,而不是和调用,而在动态链接器中找不到该包装器:g++``gcc-4.8``g++-4.8``gcc-4.8``g++-4.8

#!/bin/bash
exec ${0}SUFFIX -Wl,-rpath,PREFIX/lib64 "$@"

安装时SUFFIXPREFIX应将其替换为configure

cd ${PREFIX}/bin && rm -f gcc g++ c++ gfortran
sed -e 's#PREFIX#${PREFIX}#g' -e 's#SUFFIX#${SUFFIX}#g' gcc-wrapper.sh > ${PREFIX}/bin/gcc
chmod +x ${PREFIX}/bin/gcc
cd ${PREFIX}/bin && ln gcc g++ && ln gcc c++ && ln gcc gfortran

gcc-wrapper.sh是bash片段)。


上面的解决方案不适用于的某些版本,libtool因为它g++ -Wl,... -v采用链接模式,并因错误而失败。

更好的解决方案是使用specs文件。一旦构建了gcc / g ,请调用以下命令以将gcc / g
添加-rpath到链接器命令行中(${PREFIX}/lib64根据需要替换):

g++ -dumpspecs | awk '/^\*link:/ { print; getline; print "-rpath=${PREFIX}/lib64", $0; next } { print }' > $(dirname $(g++ -print-libgcc-file-name))/specs
2020-06-02