88

WindowsSDKとNMakeMakefileを使用してWindowsでCMakeを使用しています。

デフォルトでは、/MDコンパイラスイッチでコンパイルされます。

/MT代わりにスイッチでコンパイルするように変更するにはどうすればよいですか?

4

6 に答える 6

104

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()
于 2013-01-05T14:44:28.827 に答える
85

MSVC_RUNTIME_LIBRARYCMakeは最終的に、ターゲットプロパティを使用してバージョン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代わりに変数を設定して、グローバルデフォルトを指定することもできます。

于 2019-06-07T08:23:36.493 に答える
10

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

于 2020-03-25T07:55:49.070 に答える
2

ucm_set_runtimeをチェックしてください-このマクロは静的または動的ランタイムのフラグを置き換えます-効果を確認するには、ucm_print_flagsを使用します(このスタックオーバーフローの質問もチェックしてください)。

于 2016-10-05T20:51:59.097 に答える
2

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()
于 2019-06-10T05:15:25.137 に答える
0

cmacke 3.15以降、を使用できますMSVC_RUNTIME_LIBRARYhttps://cmake.org/cmake/help/latest/prop_tgt/MSVC_RUNTIME_LIBRARY.htmlを参照してください

于 2021-12-20T09:53:37.737 に答える