3

私は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

ああ、ばかげた質問です。

4

1 に答える 1