LoginSignup
10
9

More than 5 years have passed since last update.

Clang 3.5とgcc 4.9.2(Linux Mint)でBoost 1.57.0をビルドする

Last updated at Posted at 2014-11-18

先日、WindowsでBoost 1.57.0をビルドしましたが、今回は、Linux Mint 17 “Qiana” Cinnamon (64-bit)でBoost 1.57.0のビルドを試します。使用するコンパイラは、Clang 3.5とgcc 4.9.2です。たぶんUbuntuでも、同様の手順でインストールできるかと思います。

当然ですが、コンソールでの作業になります。

とりあえず、boost_1_57_0.tar.bz2 をダウンロードして、適当なディレクトリに解凍し、そのディレクトリに移動します。

$ wget http://sourceforge.net/projects/boost/files/boost/1.57.0/boost_1_57_0.tar.bz2
$ tar -jxvf boost_1_57_0.tar.bz2 -C oss
$ cd oss/boost_1_57_0

次に、Boost.Regexに対するicuサポートのために必要なライブラリを取得します。

$ sudo apt-get update
$ sudo apt-get install build-essential g++ python-dev autotools-dev libicu-dev build-essential libbz2-dev

これ以降の作業は、使用するコンパイラによって異なります。

Clang 3.5の場合

まず、Bjamを生成します。

$ ./bootstrap.sh --with-toolset=clang --with-libraries=all

今回はすべてのライブラリをビルドしたいので、--with-libraries=all を指定しています。次に、Boost.MPIをビルド対象にしたいので、user-config.jamを編集します。

$ user_configFile=`find $PWD -name user-config.jam`
$ echo "using mpi ;" >> $user_configFile
$ cp $user_configFile ~

そして、以下のコマンドを打ち込み、Boostを実際にBjamでビルドします。

$ ./b2 toolset=clang --with=all -link=static,shared runtime-link=shared threading=multi variant=release --stagedir="stage/clang" instruction-set=(microarchitecture type) -j(thread num)

すべてのライブラリをビルドしたいので、--with=all を指定しています。
(microarchitecture type) には、Boostを使用するコンピュータのCPUのマイクロアーキテクチャを指定します。今回は sandy-bridgehaswell でそれぞれビルドします。
link=static,shared threading=multi runtime-link=shared で、マルチスレッドで、スタティックリンクとダイナミックリンクのライブラリを生成することを指定しています。
variant=release でリリースビルドのライブラリをビルドすることを指定しています。
--stagedir= 以下には、ビルドしたライブラリを配置するディレクトリを指定します(Boostに関しては、ビルドしたライブラリを/usr/local に配置するのは避けたほうがいいらしいです。sincrinc 様の投稿記事が参考になりました。ありがとうございます: CentOS 6.0 gcc 4.7.2にBoost 1.5.0をインストール)。
(thread num) には、並列ビルドに使用するスレッド数を指定します。論理プロセッサ数 + 1の数を指定すると、最もパフォーマンスが良くなるようです。

このオプションで実際にビルドしてみると、問題なくビルドできています(下図)。

Qiita_boost_1_57_0_clang_LinuxMint_141118.png

次に、ライブラリのパスを通します。

$ sudo sh -c 'echo $HOME/oss/boost_1_57_0/stage/clang/lib >> /etc/ld.so.conf.d/local.conf'
$ sudo ldconfig

きちんとパスが通っているか、

$ ldconfig -p | grep boost

で確認してやります。正しく通っているようです(下図)。

Qiita_boost_1_57_0_clang_LinuxMint_141118_2.png

最後に、インクルードファイルのパスを通します。

$ echo export CPLUS_INCLUDE_PATH=$HOME/oss/boost_1_57_0:\$CPLUS_INCLUDE_PATH >> ~/.bashrc

きちんとビルドできているか確認するために、拙作の単純なカレンダーのプログラム(Boost.Gregorian使用)をビルドできるか試してみます。

$ wget https://gist.githubusercontent.com/dc1394/6aa6b33ef55653dadca6/raw/7e0a6c6fabfe75189b8f52a97a099547c3e4b954/MyCalendarWithBoost.cpp
$ clang++ MyCalendarWithBoost.cpp

無事にコンパイルできれば、ビルドとインストールに成功しています。お疲れ様でした。ちなみに、clang++ -std=c++11 MyCalendarWithBoost.cpp だとコンパイルに失敗しますが、これはClangのバグらしいです(参考:Debian Bug report logs - #744792 clang-3.4: unusable with libstdc++ from gcc 4.9)。

gcc 4.9.2の場合

私の環境では、gcc 4.9.2がインストールされていませんでした。よってまず、gcc 4.9.2をインストールするため、ターミナルで以下のコマンドを打ち込みます(以下のサイトを参考にさせていただきました。ありがとうございます:Install GCC GNU 4.9.1 on Ubuntu 14.04)。

$ sudo add-apt-repository ppa:ubuntu-toolchain-r/test
$ sudo apt-get update
$ sudo apt-get install gcc-4.9
$ sudo update-alternatives --remove-all gcc
$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.9 20
$ sudo update-alternatives --config gcc

Clangの場合と同様に、次のコマンドを打ち込み、Bjamを生成します。

$ ./bootstrap.sh --with-toolset=gcc --with-libraries=all

次に、Bjamにコンパイラにgcc 4.9.2を使用することを伝え、またBoost.MPIをビルド対象にしたいので、user-config.jamを編集します。

$ user_configFile=`find $PWD -name user-config.jam`
$ echo "using gcc : 4.9 : /usr/bin/gcc-4.9 ;" >> $user_configFile
$ echo "using mpi ;" >> $user_configFile
$ cp $user_configFile ~

そして、以下のコマンドを打ち込み、Boostを実際にBjamでビルドします。

$ ./b2 toolset=gcc-4.9 cxxflags="-std=c++11" --with=all -link=static,shared runtime-link=shared threading=multi variant=release --stagedir="stage/gcc" instruction-set=(microarchitecture type) -j(thread num)

オプションの指定は、Clangの場合と同様ですので、説明は省略します。このオプションで実際にビルドしてみると、いくつか失敗しています(下図)。が、実用上は問題ないと思います(たぶん)。

Qiita_boost_1_57_0_gcc-4_9_LinuxMint_141118.png

Clangの場合と同様に、ライブラリのパスを通します。

$ sudo sh -c 'echo $HOME/oss/boost_1_57_0/stage/gcc/lib >> /etc/ld.so.conf.d/local.conf'
$ sudo ldconfig

きちんとパスが通っているか、Clangの場合と同様の手順で確認します。正しく通っているようです(下図)。

Qiita_boost_1_57_0_gcc-4_9_LinuxMint_141118_2.png

最後に、インクルードファイルのパスを通します。手順は、Clangの場合と全く同じなので省略します。Clangによるビルドのときにパスを通していれば、この作業は不要(というより、同じ内容が二重に書き込まれるので、しないほうが良い)です。

きちんとビルドできているか確認するために、拙作の単純なカレンダーのプログラム(Boost.Gregorian使用)をビルドできるか試してみます。

$ wget https://gist.githubusercontent.com/dc1394/6aa6b33ef55653dadca6/raw/7e0a6c6fabfe75189b8f52a97a099547c3e4b954/MyCalendarWithBoost.cpp
$ g++ -std=c++11 MyCalendarWithBoost.cpp

無事にコンパイルできれば、ビルドとインストールに成功しています。お疲れ様でした。

10
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
9