月曜日に、Ubuntu 11.04(最初のインストール)から11.10にアップグレードしましたが、ソースからgccをビルドできなくなりました。アップグレードの前にgccパッケージをアンインストールするのを忘れていたため、Ubuntuは4.7.0コンパイラを安定版4.6.1に置き換えました。だから私は再びSVNソースをビルドしようとしましたが、失敗します。私は最近SVNリビジョン180193で試しました。
しばらくすると、ビルドが失敗して次のメッセージが表示されます。
/home/raphael/devel/gcc/build/./gcc/xgcc -B/home/raphael/devel/gcc/build/./gcc/ -B/usr/i686-pc-linux-gnu/bin/ -B/usr/i686-pc-linux-gnu/lib/ -isystem /usr/i686-pc-linux-gnu/include -isystem /usr/i686-pc-linux-gnu/sys-include -g -O2 -O2 -I. -I. -I../../src/gcc -I../../src/gcc/. -I../../src/gcc/../include -I../../src/gcc/../libdecnumber -I../../src/gcc/../libdecnumber/bid -I../libdecnumber -I../../src/gcc/../libgcc -g -O2 -DIN_GCC -W -Wall -Wwrite-strings -Wcast-qual -Wstrict-prototypes -Wmissing-prototypes -Wold-style-definition -isystem ./include -fPIC -g -DHAVE_GTHR_DEFAULT -DIN_LIBGCC2 -fbuilding-libgcc -fno-stack-protector -I. -I. -I../.././gcc -I../../../src/libgcc -I../../../src/libgcc/. -I../../../src/libgcc/../gcc -I../../../src/libgcc/../include -I../../../src/libgcc/config/libbid -DENABLE_DECIMAL_BID_FORMAT -DHAVE_CC_TLS -DUSE_TLS -o _ashldi3.o -MT _ashldi3.o -MD -MP -MF _ashldi3.dep -DL_ashldi3 -c ../../../src/libgcc/../gcc/libgcc2.c \
-fvisibility=hidden -DHIDE_EXPORTS
In file included from /usr/include/stdio.h:28:0,
from ../../../src/libgcc/../gcc/tsystem.h:88,
from ../../../src/libgcc/../gcc/libgcc2.c:29:
/usr/include/features.h:323:26: fatal error: bits/predefs.h: File or directory not found.
私はそれを設定しました:
~/devel/gcc/build$ ../src/configure --prefix=/usr --enable-languages=c++
そして、それでそれを作ります:
~/devel/gcc/build$ make -j4
念のため、中に壊れたものがある場合に備えて、ビルドディレクトリでrm -rf *
を実行しました。しかし、助けにはならなかった。
それがバックストーリーです。私はそれを修正しようとし、bits/predefs.h
を検索しました。 /usr/include/i386-linux-gnu
の中にあります。私は一時的に問題を修正しました
~/devel/gcc/build$ C_INCLUDE_PATH=/usr/include/i386-linux-gnu make -j4
Gccがcrti.o
を見つけられないと文句を言うので、これは一時的なものです。
/usr/lib/i386-linux-gnu
で見つけることができます。 今私はcouldも -実際には機能しません-しかし、私はここでシステムと戦っているような気がします。また、たとえ成功したとしても、私の新しく構築されたコンパイラはC_LIBRARY_PATH
を設定しますi386-linux-gnu
のことも知りません。したがって、私が持っているすべてのプロジェクトのすべてのビルドの前に、C_LIBRARY_PATH
とC_INCLUDE_PATH
を設定する必要があります。 I could .bashrcに追加しますが、システムを破壊しますさらに。
だから、ビルドプロセスにどのように伝えるのですか:
編集:上記のエラーメッセージの原因となるコマンドを含めるのを忘れました。また、別の解決策を考えることができます:/usr/include/i386-linux-gnu
から/usr/include
にコピーします(/usr/lib/i386-linux-gnu
から/usr/lib
に同じもの)。しかし、それも正しくないと感じています。最後に、システムのgcc 4.6.1は、4.6シリーズにはないC++ 11機能を使用するものを除き、他のアプリケーションを問題なくコンパイルできます。
このパッチを適用し、-enable-multiarchで設定します(multilibと混同しないでください):
(これは この以前のパッチ に取って代わります。)
いくつかの資料:
http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=644986
スクリプト全体を使用するのではなく、重要な部分は次のように思われます。
make FLAGS_FOR_TARGET="-B/usr/lib/i386-linux-gnu -I/usr/include/i386-linux-gnu"
正しい追加オプションで実行するには、インストール後にラッパースクリプトが必要なので、結果は完全にきれいではありません。たとえば、記事/usr/bin/gcc-4.7の例を次に示します。
#!/bin/sh
exec /opt/gcc-4.7/bin/gcc-4.7 -B/usr/lib/i386-linux-gnu -I/usr/include/i386-linux-gnu "$@"
Ubuntu 11.10はマルチアーカイブをサポートします。つまり、ライブラリファイルを/usr/lib
ではなく/usr/lib/i386-linux-gnu
(32ビット)または/usr/lib/x86_64-linux-gnu
(64ビット)に配置する必要があります。
次のようなものを使用します。
CFLAGS=-I/usr/include/i386-linux-gnu ./configure [options]
おそらくLDFLAGS=-L/usr/lib/i386-linux-gnu
も指定する必要があります。
余談:パスがきれいに見えない:/usr/i686-pc-linux-gnu/lib/
、--libdir
などのオプションを使用して修正する必要がある場合があります。
SVNからの構築以来、同じリビジョンからの構築であると確信していますか?別名、問題がアップストリームでないことを確認してください:-)