Boost.Test を使ったプログラムを Visual Studio の IDE 上で書いてコンパイルしようとしたら、libboost_unit_test_framework-vc120-mt-gd-1_60.lib が見つからない、というリンクエラーが出ました。

ライブラリ名の mt-gd はライブラリのタイプを表していて、「マルチスレッド」「デバッグビルド」「C/C++ランタイムはDLLを使う」です。あとこのライブラリ自体は「スタティック」です。確かにプロジェクトの設定としてはランタイムはDLLを使うようになっているので、ライブラリ名の自動判定は正しいようです。

ビルドした時は、「ライブラリ自体がDLLでランタイムもDLLを使う」「ライブラリ自体がスタティックでランタイムもスタティックを使う」の2通りしかビルドしていないため、「ライブラリ自体がスタティックでランタイムはDLLを使う」をリンクしようとすると見つからないのは当然です。

ソースコードに #define BOOST_DYN_LINK 1 と書いて DLL 版の boost ライブラリをリンクしてもいいんですが、DLL のあるところにパスは通していないので、出来上がったプログラムの実行がちょっとめんどくさくなります。なので、おとなしくスタティックランタイムを使う用にプロジェクトの設定を変更することにします。こうすると boost ライブラリもスタティックのものをリンクするようになります。


別の方法として、「ライブラリ自体がスタティックでランタイムはDLLを使う」をビルドしてこっちを使うこともできます。コマンドラインは以下の通り。

cd C:\boost\boost_1_60_0
b2 toolset=msvc threading=multi variant=debug,release link=static runtime-link=shared address-model=32 --stagedir=stage/x86 -j 8
b2 toolset=msvc threading=multi variant=debug,release link=static runtime-link=shared address-model=64 --stagedir=stage/x64 -j 8

なお、この逆、つまり「ライブラリ自体がDLLでランタイムはスタティックを使う」の組み合わせは「危険」(たとえば boost ライブラリ側で確保したメモリをプログラム側で解放しようとするとおかしな動作になる可能性がある)であるため、ビルドしようとすると怒られます。

C:\boost\boost_1_60_0>b2 toolset=msvc threading=multi variant=debug,release link=shared runtime-link=static address-model=64 --stagedir=stage/x64 -j 4
error: link=shared together with runtime-link=static is not allowed
error: such property combination is either impossible
error: or too dangerious to be of any use
Trackback

no comment untill now

Add your comment now