Réglage de la MSVC de l'exécution dans CMake
Je suis en suivant les instructions dans le CMake entrée de la FAQ "Comment puis-je construire mon MSVC application statique d'exécution?" de centraliser la sélection de la MSVC d'exécution pour un tas de imbriquée CMake projets (ils sont tiré comme submodules et ajouté au projet maître d'utilisation de CMake est find_package()
directive).
Alors, j'ai écrit ce CMake macro:
macro(configure_msvc_runtime)
if(MSVC)
# Default to statically-linked runtime.
if("${MSVC_RUNTIME}" STREQUAL "")
set(MSVC_RUNTIME "static")
endif()
# Set compiler options.
set(variables
CMAKE_C_FLAGS_DEBUG
CMAKE_C_FLAGS_MINSIZEREL
CMAKE_C_FLAGS_RELEASE
CMAKE_C_FLAGS_RELWITHDEBINFO
CMAKE_CXX_FLAGS_DEBUG
CMAKE_CXX_FLAGS_MINSIZEREL
CMAKE_CXX_FLAGS_RELEASE
CMAKE_CXX_FLAGS_RELWITHDEBINFO
)
if(${MSVC_RUNTIME} STREQUAL "static")
message(STATUS
"MSVC -> forcing use of statically-linked runtime."
)
foreach(variable ${variables})
if(${variable} MATCHES "/MD")
string(REGEX REPLACE "/MD" "/MT" ${variable} "${${variable}}")
endif()
endforeach()
else()
message(STATUS
"MSVC -> forcing use of dynamically-linked runtime."
)
foreach(variable ${variables})
if(${variable} MATCHES "/MT")
string(REGEX REPLACE "/MT" "/MD" ${variable} "${${variable}}")
endif()
endforeach()
endif()
endif()
endmacro()
- Je appeler cette macro au début de ma racine CMakeLists.txt
(avant tout add_library()
ou add_executable()
appel est fait) et ajouter un peu de débogage imprime:
configure_msvc_runtime()
set(variables
CMAKE_C_FLAGS_DEBUG
CMAKE_C_FLAGS_MINSIZEREL
CMAKE_C_FLAGS_RELEASE
CMAKE_C_FLAGS_RELWITHDEBINFO
CMAKE_CXX_FLAGS_DEBUG
CMAKE_CXX_FLAGS_MINSIZEREL
CMAKE_CXX_FLAGS_RELEASE
CMAKE_CXX_FLAGS_RELWITHDEBINFO
)
message(STATUS "Initial build flags:")
foreach(variable ${variables})
message(STATUS " '${variable}': ${${variable}}")
endforeach()
message(STATUS "")
Ensuite, j'ai lancer CMake pour générer une solution Visual Studio comme suit:
cmake -G "Visual Studio 9 2008" ..\.. -DMSVC_RUNTIME=dynamic
et j'obtiens les résultats suivants:
-- MSVC -> forcing use of dynamically-linked runtime.
-- Initial build flags:
-- 'CMAKE_C_FLAGS_DEBUG': /D_DEBUG /MDd /Zi /Ob0 /Od /RTC1
-- 'CMAKE_C_FLAGS_MINSIZEREL': /MD /O1 /Ob1 /D NDEBUG
-- 'CMAKE_C_FLAGS_RELEASE': /MD /O2 /Ob2 /D NDEBUG
-- 'CMAKE_C_FLAGS_RELWITHDEBINFO': /MD /Zi /O2 /Ob1 /D NDEBUG
-- 'CMAKE_CXX_FLAGS_DEBUG': /D_DEBUG /MDd /Zi /Ob0 /Od /RTC1
-- 'CMAKE_CXX_FLAGS_MINSIZEREL': /MD /O1 /Ob1 /D NDEBUG
-- 'CMAKE_CXX_FLAGS_RELEASE': /MD /O2 /Ob2 /D NDEBUG
-- 'CMAKE_CXX_FLAGS_RELWITHDEBINFO': /MD /Zi /O2 /Ob1 /D NDEBUG
Maintenant, le truc, c'est que quand je lance Visual Studio et d'examiner les propriétés du projet sous "C/C++, la Génération de Code", je vois que le "Runtime Library" n'est pas compatible avec les options de l'imprimé dans la coquille. En vertu de la "Libération", "MinSizeRel" et "RelWithDebInfo" configurations, j'obtiens les résultats attendus ("DLL multithread /MD", mais le "Debug" configuration affiche toujours "Multi-thread /MT").
Aussi, quand je force l'utilisation de l'statiquement lié runtime, j'obtiens des résultats similaires. Si je lance
cmake -G "Visual Studio 9 2008" ..\.. -DMSVC_RUNTIME=static
J'obtiens les résultats suivants:
-- MSVC -> forcing use of statically-linked runtime.
-- Initial build flags:
-- 'CMAKE_C_FLAGS_DEBUG': /D_DEBUG /MTd /Zi /Ob0 /Od /RTC1
-- 'CMAKE_C_FLAGS_MINSIZEREL': /MT /O1 /Ob1 /D NDEBUG
-- 'CMAKE_C_FLAGS_RELEASE': /MT /O2 /Ob2 /D NDEBUG
-- 'CMAKE_C_FLAGS_RELWITHDEBINFO': /MT /Zi /O2 /Ob1 /D NDEBUG
-- 'CMAKE_CXX_FLAGS_DEBUG': /D_DEBUG /MTd /Zi /Ob0 /Od /RTC1
-- 'CMAKE_CXX_FLAGS_MINSIZEREL': /MT /O1 /Ob1 /D NDEBUG
-- 'CMAKE_CXX_FLAGS_RELEASE': /MT /O2 /Ob2 /D NDEBUG
-- 'CMAKE_CXX_FLAGS_RELWITHDEBINFO': /MT /Zi /O2 /Ob1 /D NDEBUG
Et pourtant, toutes les configurations de produire le "Multi-thread /MT" valeur de la "Bibliothèque d'Exécution" réglage de l'.
Ce que je fais mal, ou si c'est un bug dans CMake (2.8.7) ou quelque chose?
Pour ce que ça vaut, si je générer de projet Visual Studio 2010 fichiers, j'obtiens une valeur différente pour le "Debug" de la configuration, mais pas encore celui que j'ai sélectionné.
Dans tous les cas, le paramètre s'affiche dans une police normale pour le "Debug" de la configuration alors qu'il apparaît en caractères gras, la police pour les autres configurations, laissant entendre que ceux-ci sont des remplacements. De plus,si j'ouvre les fichiers de projet XML, je trouve que le "Debug" configuration n'a pas de réglage pour le "RuntimeLibrary" de l'attribut "Outil" élément "Name=VCCLCompilerTool" attribut. Toutes les autres configurations ont une définition explicite.
- Excellente solution!
Vous devez vous connecter pour publier un commentaire.
Il semble que tous les alors que je travaillais sur ce, j'ai oublié d'enlever le mauvais CMake configuration je suis en train de remplacer.
Plus bas sur le script de compilation, j'avais laissé ce petit bougre:
Essentiellement, j'ai été en substituant les résultats de par
configure_msvc_runtime()
macro de construire des indicateurs qui n'a pas fixé le runtime MSVC.J'ai pris ton code et généralisée à travailler pour chaque configuration existante, et pas seulement pour Debug/Release/RelWithDebInfo/MinSizeRel.
Aussi je l'ai fait de travailler avec gcc trop - check it out ici
add_subdirectory
s de la troisième partie lib - et vous pouvez définir le runtime là - mais si le tiers lib définit l'exécution sur son propre il devrait avoir une option pour que les...Cette fonctionnalité sera améliorée avec la version de cmake-3.15.
CMAKE_MSVC_RUNTIME_LIBRARY
CMP0091
Il devrait être une question de réglage
CMAKE_MSVC_RUNTIME_LIBRARY
, par exemple (à partir de docs) pour définir "multi-threaded statiquement lié à la bibliothèque d'exécution avec ou sans les informations de débogage en fonction de la configuration":