将g ++ 4.8链接到libstdc ++

时间:2013-06-20 18:16:34

标签: c++ linux gcc g++ libstdc++

我在桌面上下载并构建了gcc 4.8.1,运行64位Ubuntu 12.04。我是根据文档推荐的源代码和命令

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

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

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

3 个答案:

答案 0 :(得分:14)

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

我通常在与gccg++相同的目录中创建一个名为gcc-4.8g++-4.8的包装,我调用它而不是gcc-4.8和{{1} },如Dynamic linker is unable to find GCC libraries中所述:

g++-4.8

安装#!/bin/bash exec ${0}SUFFIX -Wl,-rpath,PREFIX/lib64 "$@" 时,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 是bash片段。)


上述解决方案不适用于gcc-wrapper.sh的某些版本,因为libtool采用链接模式并因错误而失败。

更好的解决方案是使用specs文件。构建gcc / g ++后,调用以下命令使gcc / g ++将g++ -Wl,... -v添加到链接器命令行(根据需要替换-rpath):

${PREFIX}/lib64

答案 1 :(得分:6)

构建gcc-4.8.2时我遇到了同样的问题。我在该计算机上没有root访问权限,因此需要安装到我的主目录。在我弄清楚要使其工作所需的魔法之前花了好几次尝试所以我会在这里重现它,这样其他人就会有更轻松的时间。这些是我用来配置gcc的命令:

prefix=/user/grc/packages

export LDFLAGS=-Wl,-rpath,$prefix/lib
export LD_RUN_PATH=$prefix/lib
export LD_LIBRARY_PATH=$prefix/lib

../../src/gmp-4.3.2/configure  --prefix=$prefix
../../src/mpfr-2.4.2/configure --prefix=$prefix
../../src/mpc-0.8.1/configure  --prefix=$prefix --with-mpfr=$prefix --with-gmp=$prefix
../../src/gcc-4.8.2/configure  --prefix=$prefix --with-mpfr=$prefix --with-gmp=$prefix --with-mpc=$prefix --enable-languages=c,c++

这让我得到了一个工作二进制文件,但我使用该版本的g ++构建的任何程序都无法正常运行,除非我使用-Wl,-rpath,$ prefix / lib64选项构建它。通过提供specs文件,可以让g ++自动添加该选项。如果你运行

strace g++ 2>&1 | grep specs

您可以查看它检查specs文件的目录。在我的情况下,它是$ prefix / lib / gcc / x86_64-unknown-linux-gnu / 4.8.2 / specs所以我运行g ++ -dumpspecs来创建一个新的specs文件:

cd $prefix/lib/gcc/x86_64-unknown-linux-gnu/4.8.2
$prefix/bin/g++ -dumpspecs > xx
mv xx specs

然后编辑该文件以提供-rpath选项。搜索这样的行:

*link_libgcc:
%D

并编辑以添加rpath选项:

*link_libgcc:
%D -rpath /user/grc/packages/lib/%M

%M扩展为../lib或../lib64,具体取决于您是构建32位还是64位可执行文件。

请注意,当我在较旧的gcc-4.7版本上尝试同样的技巧时,它不起作用,因为它没有扩展%M。对于旧版本,您可以删除%M,只需硬编码lib或lib64,但如果您只构建32位可执行文件(使用lib)或仅构建64位可执行文件(使用lib64),那么这只是一个可行的解决方案。

答案 2 :(得分:3)

gcc -print-search-dirs 会告诉您编译器在哪里寻找运行时库等。您可以使用 -B<prefix> 选项覆盖它。< / p>