2009-10-24 9 views
6

Estoy compilando un archivo utilizando el CMake Build System y el compilador de Visual C++ de Microsoft. Cuando tengo CMake generar el proyecto de estudio visual, el proyecto contiene la línea de comandos para construir un tipo de tiempo de ejecución "DLL multiproceso", uno que depende de msvcrt.dll. Por varias razones no voy a entrar en este momento, no puedo depender de msvcrt.CMake, Microsoft Visual Studio y Monolithic Runtimes

¿Hay alguna manera de decirle a CMake que modifique esta opción en su proceso de construcción?

Respuesta

12

uso el siguiente fragmento de código para acceder a la estática CRT:

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

Esto es exagerado ¿no? ¿No funcionaría "foreach() string (replace,/md,/mt) endforeach()" tan bien? (es decir, deshacerse de if() y/MDd). El primer reemplazo coincidirá con el segundo de todos modos, y no tiene sentido buscar una coincidencia antes de hacer el reemplazo. – brofield

+0

Funciona para mí, dentro del foreach (flag_var ...): 'cadena (REGEX REPLACE"/MD ""/MT "$ {flag_var}" $ {$ {flag_var}} ")' –

+1

Las opciones para hacer esto están documentados en "Cómo puedo construir mi aplicación MSVC con un tiempo de ejecución estático" en http://www.cmake.org/Wiki/CMake_FAQ#Out-of-source_build_trees – javacavaj

2

puedo reemplazar las banderas dinámicas (/ MD y/TDM) con banderas estáticos (/ MT y/MTD). Además, descubrí que necesitaba almacenar en caché las variables de indicador para que se pegara.

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