私はWindows(MSVC 2012)を使用しており、Boost v1.54を使用して、次のパラメーターを使用してBoost.Log(私の小さなプロジェクトはそれに依存しています)をコンパイルしました:
b2.exe link=static variant=release runtime-link=shared --with-log stage
したがって、ログ モジュールはコンパイルされ、C ランタイム ライブラリに動的にリンクされます。
次に、私の小さなプロジェクトはCMakeを使用して管理し、ブーストを静的にリンクするオプションを追加します。
set(Boost_USE_STATIC_LIBS ON)
しかし、生成された nmake makefile の make プロセスが失敗し、リンク エラー 2038 が発生しました。
libboost_log-vc110-mt-1_54.lib(attribute_set.obj):-1: error: LNK2038:
mismatch detected for 'RuntimeLibrary': value 'MD_DynamicRelease' doesn't
match value 'MT_StaticRelease' in http_proxy_server.cpp.obj
しかし、オプションで boost をコンパイルするとruntime-link=static
、CRT を静的にリンクすることを意味し、プロジェクトを正常に作成できます。
私の質問は: 私のプロジェクトが CRT の動的にリンクされたバージョンのブーストとのリンクに失敗した理由を誰かが説明できますが、CRT の静的にリンクされたバージョンのブーストでは成功しました。違いは何ですか?
ところで: 私のプロジェクトはオプションで CRT に動的にリンクされてい/MD
ます。
編集:
最後に理由を突き止め、 と混同しましCMAKE_CXX_FLAGS_RELEASE
た。CMAKE_CXX_FLAGS
前者には/MD
オプションがありますが、後者にはオプションがありません。実際、cmake は後者をコンパイラに渡すため、エラー出力が示すように、私のプログラムは実際には静的にリンクされています。
-DCMAKE_BUILD_TYPE=Release
解決策: makefile の生成時にcmake を実行すると、自動的にオプションが追加CMAKE_CXX_FLAGS_RELEASE
され、プログラムが CRT に動的にリンクされます。CMAKE_CXX_FLAGS
ああ、ばかげた質問です。