10

デスクトップに 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

すべてのテストに合格したようで、バージョン 4.6.3 のシステム gcc と区別するために、サフィックス -4.8 を付けてすべてをホーム ディレクトリにインストールしました。

残念ながら、g++-4.8 を使用して C++ プログラムをコンパイルすると、gcc-4.8.1 からコンパイルされた新しいシステムではなく、システム libc および libstdc++ にリンクされます。標準ライブラリの新しい C++11 機能を試してみたかったので、gcc 4.8 をダウンロードしてビルドしました。システムの標準ライブラリではなく、gcc-4.8 に付属の標準ライブラリに自動的にリンクするにはどうすればよいですか?

4

3 に答える 3

6

gcc-4.8.2 をビルドするときに同じ問題が発生しました。そのマシンにはルート アクセス権がないため、ホーム ディレクトリにインストールする必要があります。これを機能させるために必要な魔法を理解するまでに何度か試みたので、他の人が簡単に使えるようにここで再現します. これらは、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++

これで動作するバイナリが得られましたが、そのバージョンの g++ でビルドしたプログラムは、-Wl,-rpath,$prefix/lib64 オプションを使用してビルドしない限り、正しく実行されませんでした。specs ファイルを提供することで、g++ にそのオプションを自動的に追加させることができます。あなたが実行する場合

strace g++ 2>&1 | grep specs

specs ファイルをチェックするディレクトリを確認できます。私の場合は $prefix/lib/gcc/x86_64-unknown-linux-gnu/4.8.2/specs だったので、 g++ -dumpspecs を実行して新しいスペック ファイルを作成しました。

cd $prefix/lib/gcc/x86_64-unknown-linux-gnu/4.8.2
$prefix/bin/g++ -dumpspecs > xx
mv xx specs

次に、そのファイルを編集して -rpath オプションを提供しました。次のような行を検索します。

*link_libgcc:
%D

編集して rpath オプションを追加します。

*link_libgcc:
%D -rpath /user/grc/packages/lib/%M

%M は、ビルドする実行可能ファイルが 32 ビットか 64 ビットかに応じて、../lib または ../lib64 に展開されます。

以前の gcc-4.7 ビルドでこの同じトリックを試したとき、%M. 古いバージョンの場合、%M を削除して lib または lib64 をハードコードするだけでかまいませんが、これは、32 ビットの実行可能ファイル (lib を使用) のみをビルドするか、64 ビットの実行可能ファイル (lib64 を使用) のみをビルドする場合にのみ実行可能なソリューションです。

于 2013-11-19T09:29:26.807 に答える