Depuración vs Liberación en CMake


En un proyecto compilado por GCC,

  • ¿Cómo corro CMake para cada tipo de destino (depuración/liberación)?
  • ¿Cómo puedo especificar los indicadores de depuración y liberación de C/C++ usando CMake?
  • ¿Cómo expreso que el ejecutable principal se compilará con g++ y una biblioteca anidada con gcc?
 311
Author: Peter Mortensen, 2011-10-11

4 answers

Con CMake, generalmente se recomienda hacer una compilación "fuera de fuente" . Crea tu CMakeLists.txt en la raíz de tu proyecto. A continuación, desde la raíz de su proyecto:

mkdir Release
cd Release
cmake -DCMAKE_BUILD_TYPE=Release ..
make

Y para Debug (de nuevo desde la raíz de tu proyecto):

mkdir Debug
cd Debug
cmake -DCMAKE_BUILD_TYPE=Debug ..
make

Release / Debug agregará las banderas apropiadas para su compilador. También hay RelWithDebInfo y MinSizeRel configuraciones de compilación.


Puede modificar / añadir a las banderas en su CMakeLists.txt a través de CMAKE_C_FLAGS_DEBUG y CMAKE_C_FLAGS_RELEASE variables, por ejemplo:

set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Wall")

Ver CMAKE_BUILD_TYPE para más detalles.


En cuanto a su tercera pregunta, no estoy seguro de lo que está preguntando exactamente. CMake debería detectar y utilizar automáticamente el compilador apropiado para sus diferentes archivos fuente.

 492
Author: kb1ooo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-12 03:38:19

Para los indicadores de depuración/liberación, vea la variable CMAKE_BUILD_TYPE (la pasa como cmake -DCMAKE_BUILD_TYPE=value). Toma valores como Release, Debug, etc.

Http://cmake.org/Wiki/CMake_Useful_Variables#Compilers_and_Tools

Cmake usa la extensión para elegir el compilador, así que simplemente nombra tus archivos .c.

Puede anular esto con varias configuraciones:

Por ejemplo:

set_source_files_properties(yourfile.c LANGUAGE CXX) 

Compilaría .archivos c con g++. El enlace anterior también muestra cómo seleccionar un compilador específico para C / C++.

 18
Author: duncan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-05 14:34:17

// CMakeLists.txt: release

set(CMAKE_CONFIGURATION_TYPES "Release" CACHE STRING "" FORCE)

// CMakeLists.txt: depurar

set(CMAKE_CONFIGURATION_TYPES "Debug" CACHE STRING "" FORCE)
 3
Author: sailfish009,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-18 07:43:03

En lugar de manipular las cadenas CMAKE_CXX_FLAGS directamente (lo que podría hacerse más bien usando string(APPEND CMAKE_CXX_FLAGS_DEBUG " -g3") por cierto), puede usar add_compiler_options:

add_compile_options(
  "-Wall" "-Wpedantic" "-Wextra" "-fexceptions"
  "$<$<CONFIG:DEBUG>:-O0;-g3;-ggdb>"
)

Esto agregaría las advertencias especificadas a todos los tipos de compilación, pero solo las banderas de depuración dadas a la compilación DEBUG. Tenga en cuenta que las opciones de compilación se almacenan como una lista CMake, que es solo una cadena que separa sus elementos por punto y coma ;.

 1
Author: sebastian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-14 15:30:10