2009-10-24 4 views
6

Je construis un fichier en utilisant le système CMake Build et le compilateur Visual C++ de Microsoft. Quand j'ai CMake générer le projet de studio visuel, le projet contient la ligne de commande pour construire un type d'exécution "Multi Threaded DLL" - un qui dépend de msvcrt.dll. Pour diverses raisons, je ne vais pas en ce moment, je ne peux pas dépendre de msvcrt.CMake, Microsoft Visual Studio et Monolithic Runtimes

Existe-t-il un moyen de dire à CMake de modifier cette option dans son processus de construction?

Répondre

12

J'utilise la pièce de code suivante pour créer un lien vers le CRT statique:

if(MSVC) 
# We statically link to reduce dependencies 
foreach(flag_var CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO) 
    if(${flag_var} MATCHES "/MD") 
     string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}") 
    endif(${flag_var} MATCHES "/MD") 
    if(${flag_var} MATCHES "/MDd") 
     string(REGEX REPLACE "/MDd" "/MTd" ${flag_var} "${${flag_var}}") 
    endif(${flag_var} MATCHES "/MDd") 
endforeach(flag_var) 
endif(MSVC) 
+3

Ceci est exagéré n'est-ce pas? Est-ce que "foreach() string (replace,/md,/mt) endforeach()" ne fonctionnerait pas aussi bien? (c'est-à-dire se débarrasser de if() et de/MDd). Le premier remplacement correspondra de toute façon au second, et il n'y a aucun intérêt à rechercher un match avant de faire le remplacement. – brofield

+0

Fonctionne pour moi, à l'intérieur de la foreach (flag_var ...): 'chaîne (REGEX REPLACE"/MD ""/MT "$ {flag_var}" $ {$ {flag_var}} ")' –

+1

Les options pour le faire sont documentés sous "Comment puis-je construire mon application MSVC avec une exécution statique" à http://www.cmake.org/Wiki/CMake_FAQ#Out-of-source_build_trees – javacavaj

2

je remplace les drapeaux dynamiques (/ MD et/MDd) avec des drapeaux statiques (/ MT et/MTd). En outre, j'ai trouvé que j'avais besoin de mettre en cache les variables du drapeau afin qu'il colle.

if(MSVC) 
    foreach(flag_var CMAKE_C_FLAGS_DEBUG CMAKE_CXX_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE CMAKE_CXX_FLAGS_RELEASE CMAKE_C_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO CMAKE_CXX_FLAGS_RELWITHDEBINFO) 
     string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}") 
     string(REGEX REPLACE "/MDd" "/MTd" ${flag_var} "${${flag_var}}") 
    endforeach(flag_var) 
    SET (CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}" CACHE STRING "MSVC C Debug MT flags " FORCE)  
    SET (CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}" CACHE STRING "MSVC CXX Debug MT flags " FORCE) 
    SET (CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}" CACHE STRING "MSVC C Release MT flags " FORCE) 
    SET (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}" CACHE STRING "MSVC CXX Release MT flags " FORCE) 
    SET (CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL}" CACHE STRING "MSVC C Debug MT flags " FORCE)  
    SET (CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL}" CACHE STRING "MSVC C Release MT flags " FORCE) 
    SET (CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO}" CACHE STRING "MSVC CXX Debug MT flags " FORCE)  
    SET (CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}" CACHE STRING "MSVC CXX Release MT flags " FORCE) 
endif()