我在运行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自动链接到其随附的标准库而不是系统标准库?
与自己的gcc链接时,您需要添加一个额外的运行时链接程序搜索路径,-Wl,-rpath,$(PREFIX)/lib64以便在运行时找到与您的gcc对应的共享库。
-Wl,-rpath,$(PREFIX)/lib64
我通常在与我调用的目录相同的目录中创建一个包装器gcc,而不是和调用,而在动态链接器中找不到该包装器:g++``gcc-4.8``g++-4.8``gcc-4.8``g++-4.8
gcc
g++``gcc-4.8``g++-4.8``gcc-4.8``g++-4.8
#!/bin/bash exec ${0}SUFFIX -Wl,-rpath,PREFIX/lib64 "$@"
安装时SUFFIX,PREFIX应将其替换为configure:
SUFFIX
PREFIX
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片段)。
gcc-wrapper.sh
上面的解决方案不适用于的某些版本,libtool因为它g++ -Wl,... -v采用链接模式,并因错误而失败。
libtool
g++ -Wl,... -v
更好的解决方案是使用specs文件。一旦构建了gcc / g ,请调用以下命令以将gcc / g 添加-rpath到链接器命令行中(${PREFIX}/lib64根据需要替换):
-rpath
${PREFIX}/lib64
g++ -dumpspecs | awk '/^\*link:/ { print; getline; print "-rpath=${PREFIX}/lib64", $0; next } { print }' > $(dirname $(g++ -print-libgcc-file-name))/specs