boostを真面目にVisualC++2010でコンパイルしてみた

手動コンパイルが簡単にできたので面白かったのですが、やっぱり真面目にやらないといけないようでした。

まずstatic runtimeでコード生成ができない。boost.threadを使って、コード生成をMTdにしてビルドしたその時言われたのが、

'libboost_thread-vc100-mt-sgd.lib'が見つかりません

でしたとさ。

単にコマンドプロンプトでbjamするだけだと、shared runtime用のデバッグ|リリースライブラリしかビルドされないようです。

なので、しっかり指定してshared runtimeとstatic runtimeなライブラリをビルドする必要があります。

ちなみに、今回話す内容はわりとWindows環境下の話だったりします。

結論だけ言うと、以下のようなオプション設定でビルドできます。

// MD ランタイム用ライブラリをビルド
>bjam --toolset=msvc-10.0 link=static runtime-link=shared release stage

// MDd ランタイム用ライブラリをビルド
>bjam --toolset=msvc-10.0 link=static runtime-link=shared debug stage

// MT ランタイム用ライブラリをビルド
>bjam --toolset=msvc-10.0 link=static runtime-link=static release stage

// MTd ランタイム用ライブラリをビルド
>bjam --toolset=msvc-10.0 link=static runtime-link=static debug stage

bjamのオプションやプロパティ設定は --help オプションを設定してbjamを呼び出せば見せてくれます。

toolsetオプションはビルドしたオブジェクトファイルを置くディレクトリをどこにするとかの設定っぽいです。
間違ってました。どのツール(ここではVisualC++コンパイラ)を使うのかの設定のようです。bjamの環境設定ファイルに記述があるようです。

linkプロパティはビルドするライブラリがstatic linkなのか、dynamic linkなのかを指定します。

runtime-linkプロパティはC++標準ランタイムライブラリをstatic linkするかdynamic linkするかの設定です。ここでMT, MTdで使えるか、MD, MDdで使えるかの設定っぽくなってます。

release, debug はrelease用のライブラリなのか、debug用のライブラリなのかの指定です。どうも両方指定できるらしい。指定しないと、両方一緒にビルドしてくれる?

最後のstageはビルドしたライブラリをどこへ出力するかの設定のようです。普通にbjamするとstageディレクトリ内のlibディレクトリに出力してくれますが、一応stageと明示しておきます。もしかしたら書かないといけない?

こういった感じで、MT, MTd, MD, MDd 全てのライブラリをビルドできます。

release, debug指定については、多分両方指定するか、指定しなければ自動的に両方作ってくれる気がします。

私自身はバラバラにやったので何ともいえないのですが。

Visual C++の場合はネット上のリポジトリからデータを取れるようになってたりするので、中々手動ビルドするときがないかも知れませんが、一応は覚えておきたいものですね。

追記)
後、Unicodeの関係で一部のライブラリ(regexとかarchiveの辺り)がビルドできないようです。
C++0xの所為でコンパイルできない可能性があるのですが。
bjam起動時にwarningでオプション指定がどうたらとか書いてあった気がするのでしっかりチェックすれば良い気がするのですが。