ぬうぱんの備忘録

技術系のメモとかいろいろ

作った曲一覧はこちら

debianでg++-4.6.3ビルド

何があった

 debianaptitudeで用意されているgccのバージョンが古くてCUDA5.0のnvccがうまくいかないので自分ソースコードを持ってきてビルド。

環境

gccのソースを入手

 ここ(http://gcc.gnu.org/mirrors.html)の適当なミラーからソースを入手。
今回は4.6.3のg++なので

  • gcc-4.6.3.tar.bz2
  • gcc-g++-4.6.3.tar.bz2

 gcc-g++の中身を解凍したらgccのディレクトリに上書き。コマンドだと同階層で解凍するだけ。

tar -jxf gcc-4.6.3.tar.bz2
tar -jxf gcc-g++-4.6.3.tar.bz2

依存パッケージ

 ビルドの前に以下のコマンドで依存パッケージを入手

sudo aptitude install libgmp3-dev libmpfr-dev libmpc-dev libc6-dev-i386

 aptitudeで入手できるのはここまで。
unzipとzipはaptitudeで用意されているバージョンが低いので手動でインストール。

wget ftp://ftp.info-zip.org/pub/infozip/src/unzip60.tgz
gunzip unzip60.tgz
tar -xvf unzip60.tar
cd unzip60
make -f unix/Makefile generic
sudo make -f unix/Makefile install
wget ftp://ftp.info-zip.org/pub/infozip/src/zip30.tgz
gunzip zip30.tgz
tar -xvf zip30.tar
cd zip30
make -f unix/Makefile generic
sudo make -f unix/Makefile install

(http://stackoverflow.com/questions/13028011/gcc-4-6-3-fail-to-install-debian)

ビルド

 パッケージを入手したらあとは次のコマンド

./configure --program-suffix=4.6 --disable-multilib
make -s -j9
sudo make install -s
  • -sは標準出力に流れるメッセージの量を少し減らす.
  • -j7は並列コンパイルの設定.コア数+1が無難.
  • もし、途中でビルド失敗してconfigure修正してやり直したけどそれでもダメって時は一度ディレクトリを削除して解凍からやり直すとキャッシュの関係でうまくいことがあるとかないとか。

バージョン切り替え

 このままだと単に"gcc"とした場合のバージョンが古いままになってしまうので、バージョンを切り替えられるように設定。
まずは登録

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.4 44 --slave /usr/bin/g++ g++ /usr/bin/g++4.4
sudo update-alternatives --install /usr/bin/gcc gcc /usr/local/bin/gcc4.6 46 --slave /usr/bin/g++ g++ /usr/local/bin/g++4.6

 切り替える時は

sudo update-alternatives --config gcc

 使用できるコンパイラのバージョンの一覧が表示されるので番号で指定。
 一応切り替わったかを次のコマンドで確認

gcc -v

共有ライブラリパスの追加

 このままだと、共有ライブラリを探しに行く時に/usr/lib/を探しに行くのだが、/usr/lib/に存在するライブラリはもともと存在していたgccの共有ライブラリで、4.6.xには対応していない。
 そのため、/etc/ld.co.confに次の行を追加してldconfigすることになる。

/usr/local/gcc4.6/lib64/
/usr/local/gcc4.6/lib/

 この、コンパイラのために共有ライブラリパスを書くというマヌケなことを回避する方法は無いんでし
ょうか?
 /usr/lib/以下に/usr/local/gcc4.6/lib*/以下をコピーしてしまうという手もあるのですが、これって問題無いんでしょうか?
 あと、これをやるとldconfigの際に次のエラーメッセージが

ldconfig: /usr/local/gcc4.6/lib64/libstdc++.so.6.0.16-gdb.py はELFファイルではありません - 間違ったmagicバイトをファイルの先頭に持っています.

どうやら特に実害のない警告のようです。精神的にはよろしくありませんが。

(http://www.mail-archive.com/lfs-support@linuxfromscratch.org/msg13351.html)

追記

 ここでは、/usr/local以下にgccをインストールしてupdate-alternativesで切り替えていますが、そもそもシステムに関連するプログラムをupdate-alternativesで切り替えるのは危険(Linuxカーネルコンパイルとか)なので、パッケージでなんとか出来るんならパッケージで何とかしましょう。

感想

 i7のエクストリームはgccのビルドの早さもエクストリームだった(小並感)