WindowsSDKとNMakeMakefileを使用してWindowsでCMakeを使用しています。
デフォルトでは、/MD
コンパイラスイッチでコンパイルされます。
/MT
代わりにスイッチでコンパイルするように変更するにはどうすればよいですか?
WindowsSDKとNMakeMakefileを使用してWindowsでCMakeを使用しています。
デフォルトでは、/MD
コンパイラスイッチでコンパイルされます。
/MT
代わりにスイッチでコンパイルするように変更するにはどうすればよいですか?
CMAKE_CXX_FLAGS_<Build Type>
および/またはCMAKE_C_FLAGS_<Build Type>
変数を変更できます。
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd")
CMakeフラグにすでにが含まれている場合は、挿入されたポイントの後/MD
に上記のコマンドが実行されるようにするか(後で追加すると、競合する既存のオプションがオーバーライドされます)、フラグを最初から設定できます。/MD
/MT
set(CMAKE_CXX_FLAGS_RELEASE "/MT")
set(CMAKE_CXX_FLAGS_DEBUG "/MTd")
/MD
または、次のようにして、既存の値と/MDd
値を/MT
それぞれ/MTd
とに置き換えることもできます。
set(CompilerFlags
CMAKE_CXX_FLAGS
CMAKE_CXX_FLAGS_DEBUG
CMAKE_CXX_FLAGS_RELEASE
CMAKE_C_FLAGS
CMAKE_C_FLAGS_DEBUG
CMAKE_C_FLAGS_RELEASE
)
foreach(CompilerFlag ${CompilerFlags})
string(REPLACE "/MD" "/MT" ${CompilerFlag} "${${CompilerFlag}}")
endforeach()
MSVC_RUNTIME_LIBRARY
CMakeは最終的に、ターゲットプロパティを使用してバージョン3.15でこれに対する適切なサポートを追加しました。
cmake_minimum_required(VERSION 3.15)
cmake_policy(SET CMP0091 NEW)
project(my_project)
add_executable(foo foo.c)
set_property(TARGET foo PROPERTY
MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
CMAKE_MSVC_RUNTIME_LIBRARY
代わりに変数を設定して、グローバルデフォルトを指定することもできます。
Visual Studio 152017およびCMake3.12の場合、置き換える方法/MD
は/MT
、このスニペットをCMakeLists.txtファイルに追加することです。
if(MSVC)
add_compile_options(
$<$<CONFIG:>:/MT> #---------|
$<$<CONFIG:Debug>:/MTd> #---|-- Statically link the runtime libraries
$<$<CONFIG:Release>:/MT> #--|
)
endif()
私は公式のCMakeリポジトリでこのソリューションを見つけました:https ://gitlab.kitware.com/cmake/cmake/issues/18390
ucm_set_runtimeをチェックしてください-このマクロは静的または動的ランタイムのフラグを置き換えます-効果を確認するには、ucm_print_flagsを使用します(このスタックオーバーフローの質問もチェックしてください)。
set( ... CACHE ... FORCE)
MSVCのデフォルトキャッシュを上書きするために使用する必要があります。
この方法を使用しない場合でも、MSVCは/MD
オプションを出力します。
set(CompilerFlags
CMAKE_CXX_FLAGS
CMAKE_CXX_FLAGS_DEBUG
CMAKE_CXX_FLAGS_RELEASE
CMAKE_CXX_FLAGS_MINSIZEREL
CMAKE_CXX_FLAGS_RELWITHDEBINFO
CMAKE_C_FLAGS
CMAKE_C_FLAGS_DEBUG
CMAKE_C_FLAGS_RELEASE
CMAKE_C_FLAGS_MINSIZEREL
CMAKE_C_FLAGS_RELWITHDEBINFO
)
foreach(CompilerFlag ${CompilerFlags})
string(REPLACE "/MD" "/MT" ${CompilerFlag} "${${CompilerFlag}}")
set(${CompilerFlag} "${${CompilerFlag}}" CACHE STRING "msvc compiler flags" FORCE)
message("MSVC flags: ${CompilerFlag}:${${CompilerFlag}}")
endforeach()
cmacke 3.15以降、を使用できますMSVC_RUNTIME_LIBRARY
。https://cmake.org/cmake/help/latest/prop_tgt/MSVC_RUNTIME_LIBRARY.htmlを参照してください