descarga - cmake vs make
CMAKE_BUILD_TYPE no se usa en CMakeLists.txt (1)
Hay dos tipos de generadores: configuraciones únicas y configuraciones múltiples.
Configuraciones simples
Generadores similares: Unix Makefiles , NMake Makefiles , MinGW Makefiles , ...
Establece el tipo de configuración en el paso de generación:
cmake -H. -B_builds/Debug -DCMAKE_BUILD_TYPE=Debug "-GUnix Makefiles"
En este caso, el paso de compilación siempre es Depurar:
> cmake --build _builds/Debug
/usr/bin/c++ -g ...
> cmake --build _builds/Debug --config Debug # `--config` ignored
/usr/bin/c++ -g ...
> cmake --build _builds/Debug --config Release # yep, ignored
/usr/bin/c++ -g ...
Multi-configuración
Generadores IDE: Visual Studio , Xcode
CMAKE_BUILD_TYPE
en el paso de generación se ignora, ambos:
> cmake -H. -B_builds -DCMAKE_BUILD_TYPE=Debug "-GVisual Studio 12 2013 Win64"
y
> cmake -H. -B_builds -DCMAKE_BUILD_TYPE=Release "-GVisual Studio 12 2013 Win64"
tendrá el mismo efecto:
Esto se debe a que todas las configuraciones son internas (es decir, _builds/msvc-opaque/Release
y _builds/msvc-opaque/Debug
o algo así, no importa). Puede usar --config
options para cambiar:
> cmake --build _builds --config Release
cl /O2 ...
> cmake --build _builds --config Debug
cl /Od ...
Control (?)
Sí tu puedes. Simplemente defina CMAKE_CONFIGURATION_TYPES :
# Somewhere in CMakeLists.txt
message("Generated with config types: ${CMAKE_CONFIGURATION_TYPES}")
Salida predeterminada:
-- Detecting CXX compiler ABI info - done
Generated with config types: Debug;Release;MinSizeRel;RelWithDebInfo
-- Configuring done
Reescribirlo:
> cmake -H. -B_builds -DCMAKE_CONFIGURATION_TYPES="Debug;Release" "-GVisual Studio 12 2013 Win64"
-- Detecting CXX compiler ABI info - done
Generated with config types: Debug;Release
-- Configuring done
Incluso puedes definir tu propio tipo de configuración:
> cmake -H. -B_builds -DCMAKE_CONFIGURATION_TYPES="Debug;MyRelease" -DCMAKE_CXX_FLAGS_MYRELEASE="/My-Rel-flag" -DCMAKE_EXE_LINKER_FLAGS_MYRELEASE="/My-Linker-flags" "-GVisual Studio 12 2013 Win64"
Y construir:
cmake --build _builds --config MyRelease
Sucio (?)
No, en absoluto, si conoces el truco :) Esta es la forma de compilar / probar la configuración en script / servidor CI / documentación de instrucciones de compilación, etc.
> CONFIG=Debug
> cmake -H. -B_builds "-DCMAKE_BUILD_TYPE=${CONFIG}" # Set Debug to Makefile, ignored by IDE
> cmake --build _builds --config "${CONFIG}" # Build Debug in IDE, ignored by Makefile
> (cd _builds && ctest -VV -C "${CONFIG}") # Test Debug in IDE, ignored by Makefile
Mal patrón
if(CMAKE_BUILD_TYPE STREQUAL Debug) # Burn it with fire!!!
set(CMAKE_BUILD_TYPE MySuperRelease) # Be ready to catch a bug from IDE user...
Bueno uno
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} --my-debug-flags")
Funciona bien
target_compile_definitions(MyTarget PUBLIC "$<$<CONFIG:Debug>:MYDEBUG_MACRO>")
¡Gracias! :) ahorras un día para un programador.
Funciona para mí con Makefile, estoy feliz ...
Algunas citas de un buen libro de un buen chico que probablemente conozcas (el énfasis es mío):
¿Por qué deberías molestarte? Las personas que programan en una variedad de sistemas o usan una variedad de compiladores se preocupan mucho porque si no lo hacen, se ven obligados a perder el tiempo encontrando y corrigiendo errores desconocidos. Las personas que afirman que no les importa la portabilidad generalmente lo hacen porque usan un solo sistema y sienten que pueden permitirse la actitud de que "el lenguaje es lo que mi compilador implementa". Esta es una visión estrecha y miope . Si su programa es un éxito, es probable que sea portado, por lo que alguien tendrá que encontrar y solucionar problemas relacionados con las características dependientes de la implementación. Además, los programas a menudo necesitan ser compilados con otros compiladores para el mismo sistema, e incluso una versión futura de su compilador favorito puede hacer algunas cosas de manera diferente a la actual. Es mucho más fácil conocer y limitar el impacto de las dependencias de implementación cuando se escribe un programa que tratar de desenredar el desorden posterior.
Tengo problemas para configurar mi configuración de compilación predeterminada para Liberar, en mi archivo CMakeLists.txt establezco CMAKE_BUILD_TYPE en la parte superior del archivo con
#enable Release ALWAYS, configure vars
set(CMAKE_BUILD_TYPE Release)
set(EXECUTABLE_NAME "ParticleSimulator")
set(VERSION_MAJOR 0)
set(VERSION_MINOR 2)
pero al construir mi proyecto y abrir la solución, siempre me presentan el modo de depuración, al contrario de lo que especifiqué en mi archivo CMakeLists. ¿Qué estoy haciendo mal? He visto algunas de las otras preguntas allí, pero no vi nada específico de esta pregunta.
Una esencia de CMakeLists.txt