visual studio - visual - Configurar el tiempo de ejecución de MSVC en CMake
vscode (2)
Estoy siguiendo las instrucciones en la entrada de preguntas frecuentes de CMake "¿Cómo puedo construir mi aplicación MSVC con un tiempo de ejecución estático?" para centralizar la selección del tiempo de ejecución MSVC para un conjunto de proyectos CMake anidados (se extraen como submódulos Git y se agregan al proyecto maestro utilizando la directiva find_package()
CMake).
Entonces, escribí esta macro CMake:
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()
Llamo a esta macro al comienzo de mi raíz CMakeLists.txt
(antes de realizar cualquier add_library()
o add_executable()
) y agrego un poco de impresiones de depuración:
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 "")
Luego, ejecuto CMake para generar una solución de Visual Studio así:
cmake -G "Visual Studio 9 2008" ../.. -DMSVC_RUNTIME=dynamic
y obtengo los siguientes resultados:
-- 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
Ahora, el problema es que cuando inicio Visual Studio y examino las propiedades del proyecto en "C / C ++, Generación de código", veo que la configuración de "Biblioteca en tiempo de ejecución" no es coherente con las opciones impresas en el shell. En las configuraciones "Release", "MinSizeRel" y "RelWithDebInfo", obtengo los resultados esperados ("DLL / MD de subprocesos múltiples", pero la configuración de "Depuración" aún muestra "Multi-threaded / MT".
Además, cuando forzo el uso del tiempo de ejecución vinculado estáticamente, obtengo resultados similares. Si corro
cmake -G "Visual Studio 9 2008" ../.. -DMSVC_RUNTIME=static
Obtengo los siguientes resultados:
-- 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
Y, sin embargo, todas las configuraciones producen el valor "Multi-threaded / MT" para la configuración "Runtime Library".
¿Puede alguien decirme qué estoy haciendo mal, o si esto es un error en CMake (2.8.7) o algo así?
Por lo que vale, si genero archivos de proyecto de Visual Studio 2010, obtengo un valor diferente para la configuración de "Depuración", pero aún no es el que seleccioné. En todos los casos, la configuración aparece en una fuente regular para la configuración de "Depuración", mientras que aparece en una fuente en negrita para las otras configuraciones, lo que sugiere que esas son anulaciones. Además, si abro los archivos del proyecto XML, encuentro que la configuración "Depurar" no tiene ninguna configuración para el atributo "RuntimeLibrary" del elemento "Herramienta" con el atributo "Nombre = VCCLCompilerTool". Todas las demás configuraciones tienen una configuración explícita.
Parece que mientras trabajé en esto, olvidé eliminar la mala configuración de CMake que estoy tratando de reemplazar.
Más abajo en el script de construcción, había dejado este pequeño insecto:
set(CMAKE_CXX_FLAGS_DEBUG
"/DWIN32 /D_WINDOWS /EHsc /WX /wd4355 /wd4251 /wd4250 /wd4996"
CACHE STRING "Debug compiler flags" FORCE
)
Básicamente, estaba anulando los resultados de la macro configure_msvc_runtime()
con indicadores de compilación que no configuraron el tiempo de ejecución de MSVC.
¡Lo siento por la molestia!
Tomé su código y lo generalicé para trabajar para cada configuración existente y no solo para Debug / Release / RelWithDebInfo / MinSizeRel.
También lo hice para trabajar con gcc también - compruébalo here