我正在尝试使用自定义前缀$PREFIX
我已将所有先决条件构建并安装到我的前缀位置,然后成功配置,构建和安装了gcc。
我现在遇到的问题是$PREFIX
不在库搜索路径中,因此无法找到共享库。
$PREFIX/bin $ ./g++ ~/main.cpp
$PREFIX/libexec/gcc/x86_64-suse-linux/4.7.2/cc1plus: \
error while loading shared libraries: \
libcloog-isl.so.1: \
cannot open shared object file: No such file or directory
什么有效,但不理想
如果我export LD_LIBRARY_PATH=$PREFIX/lib
那么它可以工作,但我正在寻找一些无需设置环境变量就可以工作的东西。
如果我使用patchelf
在所有RPATH
二进制文件上设置gcc
,那么它也有效;然而,这涉及搜索所有elf二进制文件并迭代它们调用patchelf
,我宁愿有更永久的东西。
我认为对我的目的来说是理想的
所以我希望有一种方法可以在构建过程中传递-Wl,-rpath,$PREFIX/lib
。
因为我知道路径不需要改变,所以这似乎是最强大的解决方案,也可以在我们构建下一个gcc版本时使用。
将构建过程配置为硬编码RPATH
可能吗?
我尝试过但不起作用
在致电LDFLAGS_FOR_TARGET
之前设置configure
:
所有这些都失败了:
export LDFLAGS_FOR_TARGET="-L$PREFIX/lib -R$PREFIX/lib"
export LDFLAGS_FOR_TARGET="-L$PREFIX/lib"
export LDFLAGS_FOR_TARGET="-L$PREFIX/lib -Wl,-rpath,$PREFIX/lib"
在致电LDFLAGS
之前设置configure
:
export LDFLAGS="-L$PREFIX/lib -Wl,-rpath,$PREFIX/lib"
无论如何我担心这些会覆盖{/ 1}} gcc 所拥有的任何内容,所以我不确定这些是否可行,即使它们可以使用工作?
我的配置行
为了完整性,这里是我传递配置的行:
LDFLAGS
答案 0 :(得分:9)
我发现将gmp,mpfr,mpc,isl,cloog等的源目录复制到顶级gcc源目录(或使用同名的符号链接)无处不在。这实际上是首选方式。
您需要复制(或链接)到那些的源目录名称,而不需要版本号才能生效。
编译器不需要LD_LIBRARY_PATH(尽管运行使用编译器构建的应用程序需要LD_LIBRARY_PATH到$ PREFIX / lib64或类似的东西 - 但这是不同的)
从源目录开始,您将保留所有来源。 在这个源目录中,您可以通过解压缩tarball或svn来获取gcc目录... 我使用颠覆。
此外,在这个顶级目录中,您还有以下源代码tarball:
gmp-5.1.0.tar.bz2
mpfr-3.1.1.tar.bz2
mpc-1.0.1.tar.gz
isl-0.11.1.tar.bz2
cloog-0.18.0.tar.gz
我只是下载这些并定期更新到最新的tarball。
以脚本形式:
# Either:
svn checkout svn://gcc.gnu.org/svn/gcc/trunk gcc_work
# Or:
bunzip -c gcc-4.8.0.tar.bz2 | tar -xvf -
mv gcc-4.8.0 gcc_work
# Uncompress sources.. (This will produce version numbered directories).
bunzip -c gmp-5.1.0.tar.bz2 | tar -xvf -
bunzip -c mpfr-3.1.1.tar.bz2 | tar -xvf -
gunzip -c mpc-1.0.1.tar.gz | tar -xvf -
bunzip -c isl-0.11.1.tar.bz2 | tar -xvf -
gunzip -c cloog-0.18.0.tar.gz | tar -xvf -
# Link outside source directories into the top level gcc directory.
cd gcc_work
ln -s ../gmp-5.1.0 gmp
ln -s ../mpfr-3.1.1 mpfr
ln -s ../mpc-1.0.1 mpc
ln -s ../isl-0.11.1 isl
ln -s ../cloog-0.18.0 cloog
# Get out of the gcc working directory and create a build directory. I call mine obj_work.
# I configure the gcc binary and other outputs to be bin_work in the top level directory. Your choice. But I have this:
# home/ed/projects
# home/ed/projects/gcc_work
# home/ed/projects/obj_work
# home/ed/projects/bin_work
# home/ed/projects/gmp-5.1.0
# home/ed/projects/mpfr-3.1.1
# home/ed/projects/mpc-1.0.1
# home/ed/projects/isl-0.11.1
# home/ed/projects/cloog-0.18.0
mkdir obj_work
cd obj_work
../gcc_work/configure --prefix=../bin_work <other options>
# Your <other options> shouldn't need to involve anything about gmp, mpfr, mpc, isl, cloog.
# The gcc build system will find the directories you linked,
# then configure and compile the needed libraries with the necessary flags and such.
# Good luck.
答案 1 :(得分:5)
在构建和安装gmp,isl和cloog之后,我一直在FreeBSD上使用gcc-4.8.0的这个configure
选项:
LD_LIBRARY_PATH=/path/to/isl/lib ./configure (lots of other options) \
--with-stage1-ldflags="-rpath /path/to/isl/lib -rpath /path/to/cloog/lib -rpath /path/to/gmp/lib"
并且生成的gcc二进制文件不需要任何LD_LIBRARY_PATH
。需要LD_LIBRARY_PATH
for configure,因为它编译测试程序以检查ISL版本,如果它没有找到ISL共享库,则会失败。
我在Linux(Ubuntu)上尝试过它在配置过程中失败,因为-rpath
args被传递给gcc而不是ld。我可以通过使用
--with-stage1-ldflags="-Wl,-rpath,/path/to/isl/lib,-rpath,/path/to/cloog/lib,-rpath,/path/to/gmp/lib"
代替。
答案 2 :(得分:2)
仅使用configure --with-stage1-ldflags="-Wl,-rpath,/path/to/lib"
对我来说还不足以构建gcc 4.9.2,第2阶段的bootstrap失败。有什么作用是直接传递他的标志来通过
make BOOT_LDFLAGS="-Wl,-rpath,/path/to/lib"
得到的
答案 3 :(得分:0)
虽然它仍然涉及设置环境变量,但我所做的是定义LD_RUN_PATH,它设置rpath。这样,系统的其余部分可以继续使用系统提供的库,而不是使用gcc构建生成的库。
答案 4 :(得分:0)
我会提出一个建议,我相信解决了你的问题,虽然它绝对不能回答你的问题。让我们看看我得到了多少次弃儿。
编写通用包装脚本来设置LD_LIBRARY_PATH
然后运行可执行文件很容易;见https://stackoverflow.com/a/7101577/768469。
我的想法是将--prefix=$PREFIX/install
之类的内容传递给configure
,构建一个如下所示的安装树:
$PREFIX/
install/
lib/
libcloogXX.so
libgmpYY.so
...
bin/
gcc
emacs
...
bin/
.wrapper
gcc -> .wrapper
emacs -> .wrapper
.wrapper
是一个简单的shell脚本:
#!/bin/sh
here="${0%/*}" # or use $(dirname "$0")
base="${0##*/}" # or use $(basename "$0")
libdir="$here"/../install/lib
if [ "$LD_LIBRARY_PATH"x = x ] ; then
LD_LIBRARY_PATH="$libdir"
else
LD_LIBRARY_PATH="$libdir":"$LD_LIBRARY_PATH"
fi
export LD_LIBRARY_PATH
exec "$here"/../install/bin/"$base" "$@"
这将正确转发所有参数,处理参数或目录名称中的空格,等等。出于实际目的,它与您想要的rpath
无法区分。
此外,您不仅可以将此方法用于gcc,还可以用于整个my-personal - $PREFIX
树。我一直在需要最新的GNU工具套件的环境中这样做,但我没有(或者不想承认)root权限。
答案 5 :(得分:0)
尝试将$PREFIX
添加到/etc/ld.so.conf
,然后运行ldconfig:
# echo $PREFIX >> /etc/ld.so.conf
# ldconfig
这将重新创建运行时链接程序使用的缓存,它将获取您的库。
警告:此操作将导致所有应用程序在$PREFIX
中使用新编译的库而不是默认位置