「CentOS7」で用意されてる「gcc」のバージョンは「4.8」と古いものとなっていて、新しいバージョンの「gcc」を使用するためにはソースからコンパイルしインストールする必要がありますので、その手順を説明していきます。
事前準備
gccとgcc-c++
「gcc」をソースからコンパイルするのに「gcc」と「gcc-c++」が必要なので、事前に「yum」を使用してインストールをしておきます。
# yum install gcc # yum install gcc-c++
ちなみに、「gcc-c++」がインストールされていないと、下記のようなエラーが発生します。
configure: error: in `/usr/local/src/gcc-8.2.0/build/gcc': configure: error: C++ preprocessor "/lib/cpp" fails sanity check
wgetとbzip2
gccをコンパイルする前に「download_prerequisites」で必要なライブラリをダウンロードするという手順があるのですが、その際に「wget」と「bzip2」が必要になります。
インストールされていな場合はyumでインストールしておいてください。
# yum install wget # yum install bzip2
ソースから「gcc」をインストール
「gcc」のソースをダウンロード
「gcc」のソースは下記のダウンロードミラーサイト一覧からダウンロード元を選んでダウンロードしてきます。
https://gcc.gnu.org/mirrors.html
日本からダウンロードする場合は、「http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/」からがネットワーク的に近いので良いでしょう。
この中に色々なバージョンの「gcc」があるので、インストールしたいものを選んでダウンロードしてきます。
今回は、「gcc-8.2.0」が最新だったのでこちらをダウンロードして、インストールを行っていきます。
# curl -LO http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-8.2.0/gcc-8.2.0.tar.gz # curl -LO http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-8.2.0/sha512.sum
ファイルの確認
「sha512.sum」ファイルが用意されているので、これを使用してダウンロードしてきたファイルのチェックを行います。
# sha512sum --check sha512.sum gcc-8.2.0.tar.gz: OK sha512sum: gcc-8.2.0.tar.xz: No such file or directory gcc-8.2.0.tar.xz: FAILED open or read sha512sum: WARNING: 1 listed file could not be read
今回ダウンロードしてきた「gcc-8.2.0.tar.gz」については「OK」と表示されているので、問題がないことが確認できます。
「sha512sum: gcc-8.2.0.tar.xz: No such file or directory」「gcc-8.2.0.tar.xz: FAILED open or read」というメッセージは、「gcc-8.2.0.tar.xz」をダウンロードしていないため表示されているので特に問題はありません。
インストール
ダウンロードしてきた「gcc-8.2.0.tar.gz」を「/usr/local/src」に解凍し、そのディレクトリに移動します。
# tar xzfv gcc-8.2.0.tar.gz -C /usr/local/src # cd /usr/local/src/gcc-8.2.0/
依存ライブラリのダウンロード
「download_prerequisites」を実行すると「gcc」をコンパイルするために必要なライブラリをダウンロードしてきてくれます。
# ./contrib/download_prerequisites 2019-02-25 23:17:31 URL: ftp://gcc.gnu.org/pub/gcc/infrastructure/gmp-6.1.0.tar.bz2 [2383840] -> "./gmp-6.1.0.tar.bz2" [1] 2019-02-25 23:17:36 URL: ftp://gcc.gnu.org/pub/gcc/infrastructure/mpfr-3.1.4.tar.bz2 [1279284] -> "./mpfr-3.1.4.tar.bz2" [1] 2019-02-25 23:17:41 URL: ftp://gcc.gnu.org/pub/gcc/infrastructure/mpc-1.0.3.tar.gz [669925] -> "./mpc-1.0.3.tar.gz" [1] 2019-02-25 23:17:46 URL: ftp://gcc.gnu.org/pub/gcc/infrastructure/isl-0.18.tar.bz2 [1658291] -> "./isl-0.18.tar.bz2" [1] gmp-6.1.0.tar.bz2: OK mpfr-3.1.4.tar.bz2: OK mpc-1.0.3.tar.gz: OK isl-0.18.tar.bz2: OK All prerequisites downloaded successfully.
configure make make install
ライブラリのダウンロードが完了しましたら、「configuer」でMakefileを作成し「make」でビルドし「make」インストールでインストールを行っていきます。
「gcc」のドキュメントによると、ビルドの際にはビルド用のディレクトリを作成して作業することが推奨されているので、「build」というディレクトリを作成して、そこでビルド作業を行っていくことにします。
# mkdir build # cd build # ../configure --enable-languages=c,c++ --prefix=/usr/local --disable-bootstrap --disable-multilib # make # make install
configureオプション
configureを実行する際に指定したオプションの説明です。
-
enable-languages=c,c++
cとc++のコンパイラーをビルド対象とする -
prefix=/usr/local
インストール場所の指定 - disable-bootstrap
「3-stage bootstrap build」の無効化 -
disable-multilib
64bit専用コンパイラとする(64bit環境の場合は指定)
enable-languages
「gcc」で対応している言語には「ada」「c」「c++」「d」「fortran」「go」「jit」「lto」「objc」「obj-c++」がありますが、「enable-languages」でビルド対象する言語を指定することが出来ます。
全てを対象とする場合は「all」と指定します。
prefix
「gcc」のインストール先を指定します。
「prefix=$HOME/local」といったように、自分のホームディレクトリ上にあるディレクトリを指定することで、管理者権限がないユーザでも「gcc」をインストールすることができます。
disable-bootstrap
初期状態で「gcc」は「3-stage bootstrap build」で自分のビルドを行います。
これは、下記のように3回ビルドを繰り返すのでものすごく時間は掛かりますが、より正しく「gcc」をコンパイルする方法となります。
- システムにあるコンパイラーでソースからステージ1gccをビルド
- ステージ1gccを使用してステージ2gccをビルド
- ステージ2gccを使用してステージ3gccをビルド
- ステージ2gccとステージ3gccを比較しテスト
- 比較テストに問題が無ければステージ3gccでランタイムライブラリを作成
「disable-bootstrap」を指定することで3回ビルドを行い検証するところを、時間を短縮するためにビルドを1回だけにすることが出来ますが、推奨は「3-stage bootstrap build」なので、時間があるのであれば「disable-bootstrap」は指定しないでビルドを行ったほうが良いでしょう。
参考までに、VMWare上の仮想マシン「CPU Core i7-4770 3.2GHz 1コア」「メモリ 1G」の環境で「disable-bootstrap」オプションの指定「無し」と「有り」で「make」に掛かった時間を比較してみました。
- 無し 9,606秒 (約160分)
- 有り 1,447秒(約24分)
「disable-bootstrap」オプションの指定を行わなかった場合はビルドにかなり時間が掛かってしまいました。
disable-multilib
64bit環境の場合「disable-multilib」を指定せずに「configure」を実行すると下記のようなエラーが発生します。
configure: error: I suspect your system does not have 32-bit development libraries (libc and headers). If you have them, rerun configure with --enable-multilib. If you do not have them, and want to build a 64-bit-only compiler, rerun configure with --disable-multilib.
これはメッセージにある通り32bitのライブラリが無いため発生するエラーとなります。
ですので、メッセージで指定されているように64bit環境の場合は「disable-multilib」を指定する必要があります。
バージョン確認
「gcc」のインストールが完了しましたら、「version」オプションでバージョンの確認を行ってみてください。
# /usr/local/bin/gcc --version gcc (GCC) 8.2.0 Copyright (C) 2018 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
共有ライブラリ参照設定
今回の手順で「gcc」をソースからインストールした場合、共有ライブラリが「/usr/local/lib64」に作成されるのですが、このままだとパスが通っていないためOSから参照してもらえません。
そのため、下記のどちらかの方法でパスを通してあげる必要があります。
- /etc/ld.so.confに設定 (システム全体)
- LD_LIBRARY_PATH (ユーザごとに設定が必要)
ld.so.confに設定
「/etc/ld.so.conf」に「/usr/local/lib64」のパスを追記することで、OSがライブラリを認識してくれます。
# vi /etc/ld.so.conf
共有ライブラリの格納されているディレクトリをフルパスで追記してください。
/usr/local/lib64
設定反映
「ldconfig -v」コマンドを実行して「ld.so.conf」の設定を反映させてください。
# ldconfig -v ##### 省略 ##### /usr/local/lib64: ldconfig: /usr/local/lib64/libstdc++.so.6.0.25-gdb.py is not an ELF file - it has the wrong magic bytes at the start. libatomic.so.1 -> libatomic.so.1.2.0 libitm.so.1 -> libitm.so.1.0.0 libgomp.so.1 -> libgomp.so.1.0.0 libquadmath.so.0 -> libquadmath.so.0.0.0 libssp.so.0 -> libssp.so.0.0.0 libmpxwrappers.so.2 -> libmpxwrappers.so.2.0.1 ##### 省略 #####
コマンドを実行した際に表示されるログから、上記のように「/usr/local/lib64」ディレクトリが読み込まれていることを確認してください。
not an ELF file
「ldconfig」を実行した結果、下記のようなメッセージが表示された場合の対応方法です。
ldconfig: /usr/local/lib64/libstdc++.so.6.0.25-gdb.py is not an ELF file - it has the wrong magic bytes at the start.
これは、「libstdc++.so.6.0.25-gdb.py」は「python」のスクリプトなのですが、これを共有ライブラリとして認識してしまっているのが原因となります。
# file /usr/local/lib64/libstdc++.so.6.0.25-gdb.py /usr/local/lib64/libstdc++.so.6.0.25-gdb.py: Python script, ASCII text executable
対応方法としては、該当ファイルの名前を変更して共有ライブラリと認識されないようすることで、このメッセージは表示されないようになります。
# mv /usr/local/lib64/libstdc++.so.6.0.25-gdb.py /usr/local/lib64/back_libstdc++.so.6.0.25-gdb.py # ldconfig
/etc/ld.so.conf.dにファイルを作成する方法
CentOS7の場合「/etc/ld.so.conf」に「include ld.so.conf.d/*.conf」と設定されています。
# cat /etc/ld.so.conf include ld.so.conf.d/*.conf
これは「ld.so.conf.d」ディレクトリ内の「.conf」という拡張子をもったファイルの内容を読み込むという設定となります。
ですので、「ld.so.conf.d」ディレクトリ内に「/usr/local/lib64」のパスを記述した「.conf」ファイルを作成することでも、共有ライブラリのパスをOSに認識させることが出来ます。
今回は「usr-local-lib64.conf」というファイルを作成していますが、ファイル名は「.conf」という拡張子をつけたファイル名であれば適当に設定してもらってもかまいません。
# cd /etc/ld.so.conf.d # vi usr-local-lib64.conf
ファイルの設定内容は下記の通りとなります。
/usr/local/lib64
設定を反映させる場合は「ldconfig」コマンドを実行します。
# ldconfig -v
LD_LIBRARY_PATHに設定
こちらの方法はユーザ毎に設定する必要があります。
「~/.bash_profile」に「LD_LIBRARY_PATH」の設定を追加することで、ユーザがログインする際に設定が読み込まれるようになります。
$ cd $ vi .bash_profile
設定内容
今回は「/usr/local/lib64」としていますが、「gcc」のインストール先を「/usr/local/」以外にしている場合は適宜読み替えて設定を行ってください。
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib64
設定反映
「~/.bash_profile」はユーザがログインした際に読み込まれるので、一旦ログアウトし再度ログインすることで設定が反映されます。
ログアウトせずに反映させたい場合は「source」コマンドで「.bash_profile」ファイルを読み込んでください。
$ source .bash_profile
コメント