2009-10-24 12 views
6

Buduję plik przy użyciu CMake Build System i kompilatora Visual C++ Microsoftu. Kiedy mam CMake wygenerować projekt studio wizualne, projekt zawiera wiersz polecenia, aby zbudować typ "Multi Threaded DLL" typu runtime - jeden, który zależy od msvcrt.dll. Z różnych powodów nie wchodzę teraz, nie mogę polegać na msvcrt.CMake, Microsoft Visual Studio i Monolithic Runtimes

Czy istnieje sposób, aby powiedzieć CMake, aby zmodyfikować tę opcję w jej procesie budowy?

Odpowiedz

12

używam następujący fragment kodu w celu podłączenia się do statycznego 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

To jest przesada, prawda? Czy "foreach() string (replace,/md,/mt) endforeach()" nie działa tak dobrze? (tj. pozbyć się if() i/MDd). Pierwsza zamiana i tak pasuje do drugiej, i nie ma sensu szukanie meczu przed dokonaniem wymiany. – brofield

+0

Działa dla mnie, wewnątrz foreach (flag_var ...): 'string (ZMIANA REGEXU"/MD ""/MT "$ {flag_var}" $ {$ {flag_var}} ")' –

+1

Możliwości zrobienia tego są udokumentowane w sekcji "Jak mogę zbudować moją aplikację MSVC ze statycznym środowiskiem wykonawczym" pod adresem http://www.cmake.org/Wiki/CMake_FAQ#Out-of-source_build_trees – javacavaj

2

zastąpić dynamiczne Flagi (/ MD i/MDD) z flagami statycznych (/ MT i/MTD). Zauważyłem również, że muszę buforować zmienne flag w celu ich zachowania.

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() 
Powiązane problemy