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を設定すると、それも機能します。ただし、これにはすべての elf バイナリを検索し、それらを繰り返し呼び出す必要があります。RPATHgccpatchelf

私の目的にとって理想的だと思うもの

-Wl,-rpath,$PREFIX/libだから、ビルドプロセス中にmakeに合格する方法があることを願っています。

パスを変更する必要がないことはわかっているので、これが最も堅牢なソリューションのように思えます。また、次の 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" 

いずれにせよ、これらがLDFLAGSgcc持っていたものを上書きするのではないかと心配しているので、機能させることができたとしても、これらが実行可能なオプションであるかどうかわかりませんか?

私の構成行

完全を期すために、構成に渡す行を次に示します。

./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 を必要としません (ただし、コンパイラでビルドされたアプリケーションを実行するには、$PREFIX/lib64 またはそのようなものへの LD_LIBRARY_PATH が必要ですが、それは異なります)。

すべてのソースを保持するソース ディレクトリから開始します。このソース ディレクトリには、tarball または svn を解凍することで、gcc ディレクトリが作成されます。私は subversion を使用しています。

また、この最上位ディレクトリには、たとえば次のソース 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

configuregmp、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 バージョンをチェックするテスト プログラムをコンパイルするためです。

-rpath引数がldではなくgccに渡されたため、構成中に失敗したLinux(Ubuntu)で試しました。を使用してこれを修正できます

--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 に答える
0

環境変数の設定も必要ですが、rpath を設定する LD_RUN_PATH を定義します。そうすれば、システムの残りの部分は、gcc ビルドが生成するライブラリを使用する代わりに、システムが提供するライブラリを使用し続けることができます。

于 2013-04-22T09:50:11.577 に答える
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は単純なシェル スクリプトです。

#!/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 に答える