将g ++ 4.8链接到libstdc ++

我在桌面上下载并构build了gcc 4.8.1,运行64位Ubuntu 12.04。 我build立它的源头,如文档build议,并与命令

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

它似乎通过了所有的testing,我把所有的东西都安装到我的主目录(后缀为-4.8),以便与系统gcc(版本4.6.3)区分开来。

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

Solutions Collecting From Web of "将g ++ 4.8链接到libstdc ++"

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

我通常在与gcc-4.8g++-4.8相同的目录中创建一个名为gccg++的包装器,而不是gcc-4.8g++-4.8 , 动态链接器无法找到GCC库 :

 #!/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假定链接模式并失败并显示错误。

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

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

构建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选项构建它。 通过提供规格文件,可以让g ++自动添加该选项。 如果你跑步

 strace g++ 2>&1 | grep 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),那么这只是一个可行的解决方案。

gcc -print-search-dirs会告诉你编译器在哪里查找运行库等,你可以用-B<prefix>选项覆盖它。