cjo*_*an1 9 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
Run Code Online (Sandbox Code Playgroud)
它似乎通过了所有测试,并且我将所有内容安装到我的主目录中,后缀为-4.8,以区别于系统gcc,即版本4.6.3.
不幸的是,当我使用g ++ - 4.8编译c ++程序时,它链接到系统libc和libstdc ++,而不是从gcc-4.8.1编译的新程序.我下载并构建了gcc 4.8,因为我想在标准库中使用新的C++ 11功能,所以这种行为绝对不是我想要的.我该怎么做才能让gcc-4.8自动链接到它附带的标准库而不是系统标准库?
Max*_*kin 15
当您使用自己的gcc进行链接时,需要添加额外的运行时链接程序搜索路径,-Wl,-rpath,$(PREFIX)/lib64
以便在运行时找到与您的gcc对应的共享库.
我通常创建一个名为包装gcc
,并g++
在同一目录gcc-4.8
和g++-4.8
我调用,而不是gcc-4.8
和g++-4.8
,规定在动态链接器不能找到GCC库:
#!/bin/bash
exec ${0}SUFFIX -Wl,-rpath,PREFIX/lib64 "$@"
Run Code Online (Sandbox Code Playgroud)
当安装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
Run Code Online (Sandbox Code Playgroud)
(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
Run Code Online (Sandbox Code Playgroud)
小智 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++
Run Code Online (Sandbox Code Playgroud)
这让我得到了一个工作二进制文件,但我使用该版本的g ++构建的任何程序都无法正常运行,除非我使用-Wl,-rpath,$ prefix/lib64选项构建它.通过提供specs文件,可以让g ++自动添加该选项.如果你跑
strace g++ 2>&1 | grep specs
Run Code Online (Sandbox Code Playgroud)
你可以看到它检查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
Run Code Online (Sandbox Code Playgroud)
然后编辑该文件以提供-rpath选项.搜索这样的行:
*link_libgcc:
%D
Run Code Online (Sandbox Code Playgroud)
并编辑以添加rpath选项:
*link_libgcc:
%D -rpath /user/grc/packages/lib/%M
Run Code Online (Sandbox Code Playgroud)
%M扩展为../lib或../lib64,具体取决于您是构建32位还是64位可执行文件.
请注意,当我在较旧的gcc-4.7版本上尝试同样的技巧时,它不起作用,因为它没有扩展%M.对于旧版本,您可以删除%M,只需硬编码lib或lib64,但如果您只构建32位可执行文件(使用lib)或仅构建64位可执行文件(使用lib64),那么这只是一个可行的解决方案.