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