如何让源码编译的g++始终使用自行编译的libstdc++
问题
我在/home/user/toolchains/gcc/路径下编译了GNU编译器集合,但使用新编译的g执行命令时,返回的仍是系统的libstdc.so路径:
$ g++ -print-file-name=libstdc++.so /usr/lib/gcc/x86_64-linux-gnu/11/libstdc++.so
我清楚需要在链接阶段为GCC配置RUNPATH或RPATH信息,使其优先链接自行编译的/home/user/toolchains/gcc/lib64/libstdc++.so.6.0.33(从GCC视角等价于$ORIGIN/../lib64/libstdc++.so.6.0.33)。CMake项目里可以通过-DCMAKE_CXX_LINK_FLAGS="-Wl,-rpath,$HOME/toolchains/gcc/lib64"设置,但不知道如何在GCC自身的编译流程中实现该配置。
以下是我当前使用的编译脚本:
#!/usr/bin/bash gcc_version=14.2.0 wget https://ftp.gnu.org/gnu/gcc/gcc-${gcc_version}/gcc-${gcc_version}.tar.xz wget https://ftp.gnu.org/gnu/gcc/gcc-${gcc_version}/gcc-${gcc_version}.tar.xz.sig wget https://ftp.gnu.org/gnu/gnu-keyring.gpg signature_invalid=`gpg --verify --no-default-keyring --keyring ./gnu-keyring.gpg gcc-${gcc_version}.tar.xz.sig` if [ $signature_invalid ]; then echo "Invalid signature" ; exit 1 ; fi tar -xvJf gcc-${gcc_version}.tar.xz cd gcc-${gcc_version} ./contrib/download_prerequisites cd .. mkdir gcc-${gcc_version}-build cd gcc-${gcc_version}-build $PWD/../gcc-${gcc_version}/configure \ --prefix=$HOME/toolchains/gcc \ --enable-languages=c,c++ \ --program-suffix=-${gcc_version}\ --disable-multilib \ --with-system-zlib \ --enable-default-pie \ --enable-default-ssp \ --enable-host-pie \ --disable-fixincludes make -j$(nproc) make install
解决步骤
要让编译完成的GCC默认优先使用自身的libstdc++.so,只需在configure阶段添加指定RPATH的参数,具体修改如下:
- 在
configure命令末尾添加--with-rpath='$ORIGIN/../lib64'(用单引号包裹,避免shell提前解析$ORIGIN变量),也可以使用绝对路径形式--with-rpath=${HOME}/toolchains/gcc/lib64。
修改后的configure片段如下:
$PWD/../gcc-${gcc_version}/configure \ --prefix=$HOME/toolchains/gcc \ --enable-languages=c,c++ \ --program-suffix=-${gcc_version}\ --disable-multilib \ --with-system-zlib \ --enable-default-pie \ --enable-default-ssp \ --enable-host-pie \ --disable-fixincludes \ --with-rpath='$ORIGIN/../lib64'
删除原有的
gcc-${gcc_version}-build目录,重新创建并依次执行configure、make、make install命令。验证效果:使用新编译的g++再次执行
g++ -print-file-name=libstdc++.so,此时应返回自定义路径下的文件:
/home/user/toolchains/gcc/lib64/libstdc++.so
如果只是临时测试,也可以在运行g++前设置环境变量:export LD_LIBRARY_PATH=/home/user/toolchains/gcc/lib64,但上述configure参数是永久生效的方案,无需每次手动设置环境变量。
内容的提问来源于stack exchange,提问作者glades

