仕事でCentOS 6.3な環境でテストプログラムを書いていて、乱数が必要になったので、ふと思いたってc++11のメルセンヌツイスタを使ってみようとしました。
ところが、標準でインストールされているg++は
$ g++ --version
g++ (GCC) 4.4.7 20120313 (Red Hat 4.4.7-3)
Copyright (C) 2010 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 PARTICULmmAR PURPOSE.
このバージョンだとstd::mersenne_twister_engineはあるけど、std::uniform_real_distribution は未実装という残念な状況です。
しかもアップデートパッケージも用意されていない模様。
ま、コンパイラが入ってるんだからソースから入れりゃ良いだろうってことで、最新リリースのver. 4.8.0を
gcc4.8.0を入れてみることにしました。*1
手順は以下のとおり
依存しているライブラリをyumで入れる
> yum install gmp.x86_64 gmp-devel.x86_64 > yum install mpfr-devel.x86_64 mpfr.x86_64 > yum install libmpc-devel.x86_64 libmpc.x86_64
gccのソースを取ってくる
これは、GNUのページにある適当なミラーサイトからどうぞ
http://gcc.gnu.org/mirrors.html
適当なディレクトリに展開
>tar xfj gcc-4.8.0.tar.bz2
configureしてmake
既存のgccを上書きしないように、/opt/gcc48へインストールすることにします。
> configure --prefix=/opt/gcc48 &&make &&make install
私の環境では、libgcc/libgcc2.cのコンパイルで以下のエラーが出ました。
In file included from /usr/include/features.h:385:0, from /usr/include/stdio.h:28, from ../../.././libgcc/../gcc/tsystem.h:87, from ../../.././libgcc/libgcc2.c:27: /usr/include/gnu/stubs.h:7:27: fatal error: gnu/stubs-32.h: No such file or directory # include^
ググってみたら、stackoverflowに"You're missing the 32 bit libc dev package"と書かれてたのが見えたので
yumでglibc-devel.i686を入れて、念の為x86_64の方もアップデートした上でmakeを継続。
>yum install glibc-devel.i686 glibc.i686 glibc-devel.x86_64 glibc-headers.x86_64 >make&&make install
moduleの設定ファイルを用意
CentOS 6.3ではmoduleが使えるようになっているので、/etc/modulefiles/gcc48を次のような内容で作ります。
#%Module 1.0 # # gcc ver. 4.8.0 module for use with 'environment-modules' package: # prepend-path PATH /opt/gcc48/bin prepend-path LD_LIBRARY_PATH /opt/gcc48/lib
中身はopenmpiのものをコピーして書き換えただけなので、まっとうなものかどうかは分かりません:(
これで、gcc4.8.0のインストールが完了です。
module availするとgcc48が見えて、module load gcc48すればver 4.8.0のgccを使うことができます。
もちろん、module unload gcc48すれば、元のgcc 4.4.7を使うこともできます。
>module avail -------------------------------------------------------------- /usr/share/Modules/modulefiles --------------------------------------------------------------- dot module-cvs module-info modules null use.own --------------------------------------------------------------------- /etc/modulefiles ---------------------------------------------------------------------- gcc48 openmpi-x86_64 >module load gcc48 > gcc --version gcc (GCC) 4.8.0 Copyright (C) 2013 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. >module unload gcc48 >gcc --version gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-3) Copyright (C) 2010 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.
ちなみに仕事のプログラムはrand()を使いました。だってコンパイルに20時間くらいかかったし・・・orz
*1:2.9の頃の大騒動を思うと、いくらリリース版とはいえ最新を入れるのはちょっと怖いとこですが・・・