92 votes

Compiler avec /MT au lieu de /MD en utilisant CMake

J'utilise CMake sous Windows avec le SDK Windows et les Makefiles NMake.

Par défaut, il compile avec le /MD le commutateur de compilateur.

Comment puis-je le modifier pour qu'il compile avec le programme /MT à la place ?

108voto

Fraser Points 20579

Vous pouvez modifier le CMAKE_CXX_FLAGS_<Build Type> et/ou CMAKE_C_FLAGS_<Build Type> variables :

set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd")

Si vos drapeaux CMake contiennent déjà /MD vous pouvez vous assurer que les commandes ci-dessus sont exécutées. après le point auquel /MD est inséré (l'ajout ultérieur de /MT remplace l'option existante en conflit), ou vous pouvez définir les drapeaux à partir de zéro :

set(CMAKE_CXX_FLAGS_RELEASE "/MT")
set(CMAKE_CXX_FLAGS_DEBUG "/MTd")

Ou bien, vous pouvez remplacer l'actuel /MD y /MDd avec des valeurs /MT y /MTd respectivement en faisant quelque chose comme :

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()

90voto

ComicSansMS Points 12749

CMake a finalement ajouté un support approprié pour cela dans la version 3.15 avec l'option MSVC_RUNTIME_LIBRARY propriété de la cible :

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>")

Vous pouvez également spécifier une valeur par défaut globale en définissant le paramètre CMAKE_MSVC_RUNTIME_LIBRARY à la place.

12voto

Il semble que pour Visual Studio 15 2017 y CMake 3.12 la façon de remplacer /MD por /MT est d'ajouter cet extrait au fichier CMakeLists.txt :

if(MSVC)
    add_compile_options(
        $<$<CONFIG:>:/MT> #---------|
        $<$<CONFIG:Debug>:/MTd> #---|-- Statically link the runtime libraries
        $<$<CONFIG:Release>:/MT> #--|
    )
endif()

J'ai trouvé cette solution dans le dépôt officiel de CMake : https://gitlab.kitware.com/cmake/cmake/issues/18390

3voto

onqtam Points 2107

Vérifiez ucm_set_runtime - cette macro remplacera les drapeaux pour l'exécution statique ou dynamique - pour voir les effets, utilisez ucm_print_flags (voir aussi la caisse este Question de Stack Overflow).

3voto

shawn Points 3385

Je dois utiliser set( ... CACHE ... FORCE) pour écraser le cache par défaut de MSVC.

Si je n'utilise pas cette méthode, MSVC sort toujours /MD options.

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()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X