Visutal Studio で Boost C++ Libraries をビルドする

Visutal Studio で Boost C++ Libraries をビルドする必要が出てきたのですが,いくつか嵌った事があったのでメモ.まず,以下のサイトで Windows のバイナリが配布されているようです.バージョンは,3/23 現在で 1.44.0 とやや古い(最新バージョンは 1.46.1)ですが,手軽にインストールするならこれを利用する方法もあります.

今回は,バージョンが古いのと x64 バイナリを作成するためのライブラリも必要だったので自力でビルドする事にしました.

bjam オプション

Boost のビルド自体は,解凍したディレクトリで以下のコマンドを叩けば,基本的には OK です.

C:\code\boost_1_46_1> bootstrap.bat
C:\code\boost_1_46_1> bjam.exe 

ここでは,bjam.exe --help で出てくるもののうち,よく使いそうなものを以下に抜粋しておきます.「--(二重ハイフン)」があったりなかったりするので注意が必要です.特に toolset の箇所は,(ググると)古い情報のものだと --toolset=<value> と指定するようにと言う説明の記事もあるので特に注意する必要があります.










オプション 説明
--stagedir=<value> *.lib がインストールされるディレクトリ.デフォルト値は ./stage*1
--without-<value> ビルドしないライブラリを(その個数分)指定する.ver. 1.46.1 では,以下の 17種類が存在する.

  • date_time
  • filesystem
  • graph
  • graph_parallel
  • iostreams
  • math
  • mpi
  • program_options
  • python
  • random
  • regex
  • serialization
  • signals
  • system
  • test
  • thread
  • wave

デフォルトでは,全てのライブラリがビルドされる.

toolset=<value> ビルドに使用するツールセット(コンパイラ&リンカ?)を指定する.Visual Studio の場合は msvc.尚,msvc-9.0 のようにバージョンを併記すると,(複数の Visual Studio が存在する場合に)使用するツールセットを厳密に指定できる模様.
variant=<value> debug or release のどちらかを指定する.debug,release と記述すると両方のライブラリが同時に生成される?
link=<value> static or shared のどちらかを指定する.Boost のライブラリを静的リンクするかどうかを指定する.
runtime-link=<value> static or shared のどちらかを指定する.こちらは,VC++ の標準ライブラリを静的にリンクするかどうかを指定する.プロジェクトで /MT を指定する場合には runtime-link=static, /MD を指定する場合には runtime-link=shared にしないとライブラリのリンクで問題が発生する模様.

デフォルト(bjam.exe のみ)でビルドすると runtime-link=shared でビルドされるようで,/MT 指定のプロジェクトでビルドしようとすると Boost のライブラリをリンクする際にエラーが発生しました.したがって,/MT でビルドする場合は runtime-link=static を明示的に指定する必要があるようです.

x64 版のビルド

引き続き x64版のビルド.まず,私は x64 版のコマンドラインを出現させるところで躓いたのでその準備から・・・ Express バージョンでは恐らく,x64 用のコマンドプロンプト(のためのショートカット)は作成されないようです.そのため,まずスタートメニューの「Visual Studio コマンドプロンプト」をコピーし,「リンク先」の箇所の引数の部分を 「x86」から「amd64」に変更して x64 用のコマンドプロンプトを作成します.

%comspec% /k ""C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat"" x86
↓
%comspec% /k ""C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat"" amd64

しかし,これだけでは起動に失敗します.amd64 の場合は VC\bin\amd64\vcvars64.bat のバッチファイルを利用するように記述されてあるのですが,該当のファイルが存在しないためです.そこで,以下のような記述をした vcvars64.bat ファイルを作成し,該当ディレクトリにコピーします.尚,これを実行するためには,あらかじめ Windows SDK をインストールしておく必要があります(下記の例だと Windows SDK 7.1).

@echo off
CALL "C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.cmd" /x64

この後,表示されたコマンドプロンプト上で以下のように address-model=64 を付けてビルドすると,x64 用のライブラリがビルドされるようです.

C:\code\boost_1_46_1> bjam.exe toolset=msvc address-model=64 link=static runtime-link=static

最初に x64用のコマンドプロンプトを起動しないと toolset=msvc-10.0.amd64 とやっても address-model=64 とやっても x86用のライブラリが作成されてしまうようで,結構長い時間ここで嵌りました.

*1:正確には,指定したディレクトリ下に lib ディレクトリが作成され,その中に *.lib がインストールされる.