9

我正在尝试使用自定义前缀构建 gcc 4.7.2$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二进制文件,那么它也可以工作;但是,这涉及搜索所有精灵二进制文件并遍历它们调用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" 

无论如何,我担心这些会覆盖 gcc 的任何内容LDFLAGS所以我不确定这些是否是可行的选择,即使它们可以工作?

我的配置行

为了完整起见,这是我传递给配置的行:

./configure \
    --prefix=$PREFIX \
    --build=x86_64-suse-linux \
    --with-pkgversion='SIG build 12/10/2012' \
    --disable-multilib \
    --enable-cloog-backend=isl \
    --with-mpc=$PREFIX \
    --with-mpfr=$PREFIX \
    --with-gmp=$PREFIX \
    --with-cloog=$PREFIX \
    --with-ppl=$PREFIX \
    --with-gxx-include-dir=$PREFIX/include/c++/4.7.2
4

6 回答 6

10

我发现将 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.
于 2013-04-21T17:47:31.277 回答
5

configure在构建和安装 gmp、isl 和 cloog 之后,我一直在 FreeBSD 上将此选项与 gcc-4.8.0 一起使用:

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. 需要 for configure 是因为它编译了LD_LIBRARY_PATH一个测试程序来检查 ISL 版本,如果它没有找到 ISL 共享库,它将失败。

我在 Linux (Ubuntu) 上尝试过,在配置过程中失败,因为-rpathargs 被传递给 gcc 而不是 ld。我可以通过使用来解决这个问题

--with-stage1-ldflags="-Wl,-rpath,/path/to/isl/lib,-rpath,/path/to/cloog/lib,-rpath,/path/to/gmp/lib"

反而。

于 2013-04-21T17:00:38.607 回答
2

仅使用configure --with-stage1-ldflags="-Wl,-rpath,/path/to/lib"不足以让我构建 gcc 4.9.2,引导在第 2 阶段失败。有效的是直接传递他的标志以通过

make BOOT_LDFLAGS="-Wl,-rpath,/path/to/lib"

我从https://gcc.gnu.org/ml/gcc/2008-09/msg00214.html得到这个

于 2015-12-20T14:53:12.367 回答
0

虽然它仍然涉及设置环境变量,但我所做的是定义 LD_RUN_PATH,它设置了 rpath。这样,系统的其余部分可以继续使用系统提供的库,而不是使用 gcc 构建生成的库。

于 2013-04-22T09:50:11.577 回答
0

我将提出一个我认为可以解决您的问题的建议,尽管它绝对不能回答您的问题。让我们看看我得到了多少反对票。

编写一个通用的包装脚本来设置LD_LIBRARY_PATH然后运行可执行文件很容易;请参阅https://stackoverflow.com/a/7101577/768469

这个想法是传递类似--prefix=$PREFIX/installto的东西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- $PREFIXtree。我一直在需要最新的 GNU 工具套件但我没有(或不想承认有)root 访问权限的环境中这样做。

于 2013-04-22T22:41:12.810 回答
0

尝试将您的添加$PREFIX/etc/ld.so.conf然后运行 ​​ldconfig:

# echo $PREFIX >> /etc/ld.so.conf
# ldconfig

这将重新创建运行时链接器使用的缓存,并将获取您的库。

警告:此操作将导致所有应用程序使用您新编译的库$PREFIX而不是默认位置

于 2013-04-24T22:23:46.913 回答