Depurar vs lanzar en CMake

Resuelto Cartesius00 asked hace 12 años • 6 respuestas

En un proyecto compilado de GCC,

  • ¿Cómo ejecuto CMake para cada tipo de destino (depuración/lanzamiento)?
  • ¿Cómo especifico la depuración y la liberación de indicadores C/C++ usando CMake?
  • ¿Cómo expreso que el ejecutable principal se compilará con g++una biblioteca anidada gcc?
Cartesius00 avatar Oct 11 '11 17:10 Cartesius00
Aceptado

Con CMake, generalmente se recomienda realizar una compilación "fuera del código fuente" . Crea tu CMakeLists.txten la raíz de tu proyecto. Luego desde la raíz de tu proyecto:

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

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

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

Release/ Debugagregará los indicadores apropiados para su compilador. RelWithDebInfoTambién hay MinSizeRelconfiguraciones de compilación.


Puede modificar/agregar indicadores especificando un archivo de cadena de herramientas en el que puede agregar CMAKE_<LANG>_FLAGS_<CONFIG>_INITvariables, por ejemplo:

set(CMAKE_CXX_FLAGS_DEBUG_INIT "-Wall")
set(CMAKE_CXX_FLAGS_RELEASE_INIT "-Wall")

Consulte CMAKE_BUILD_TYPE para obtener más detalles.


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

kb1ooo avatar Oct 11 '2011 11:10 kb1ooo

Muchas de las respuestas aquí están desactualizadas o son malas. Así que intentaré responderla mejor. De acuerdo, responderé esta pregunta en 2020, por lo que se espera que las cosas cambien.


¿Cómo ejecuto CMake para cada tipo de destino (depuración/lanzamiento)?

En primer lugar, Depurar/liberar se denominan configuraciones en cmake (quisquilloso).

Si está utilizando un único generador de configuración (Ninja/Unix-Makefiles), debe especificar CMAKE_BUILD_TYPE .

Como esto:

# Configure the build
cmake -S . -B build/ -D CMAKE_BUILD_TYPE=Debug

# Actually build the binaries
cmake --build build/

# Configure a release build
cmake -S . -B build/ -D CMAKE_BUILD_TYPE=Release

# Build release binaries
cmake --build build/

Para los generadores de configuración múltiple es ligeramente diferente (Ninja Multi-Config, Visual Studio)

# Configure the build
cmake -S . -B build

# Build debug binaries
cmake --build build --config Debug

# Build release binaries
cmake --build build --config Release

Si se pregunta por qué es necesario esto, es porque cmake no es un sistema de compilación. Es un sistema de metaconstrucción (es decir, un sistema de compilación que construye sistemas de compilación). Esto es básicamente el resultado de manejar sistemas de compilación que admiten múltiples configuraciones en 1 compilación. Si desea una comprensión más profunda, le sugiero leer un poco sobre cmake en el libro de Craig Scott "Professional CMake: A Practical Guide".


¿Cómo especifico la depuración y la liberación de indicadores C/C++ usando CMake?

La práctica moderna es utilizar objetivos y propiedades.

Aquí hay un ejemplo:

add_library(foobar)

# Add this compile definition for debug builds, this same logic works for
# target_compile_options, target_link_options, etc.
target_compile_definitions(foobar PRIVATE
    $<$<CONFIG:Debug>:
        FOOBAR_DEBUG=1
    >
)

NOTA: ¡Cómo estoy usando expresiones generadoras para especificar la configuración! ¡Usar CMAKE_BUILD_TYPE dará como resultado compilaciones incorrectas para cualquier generador de configuración múltiple!

Además, a veces es necesario configurar las cosas globalmente y no solo para un objetivo. Utilice add_compile_definitions, add_compile_options, etc. Esas funciones admiten expresiones generadoras. No uses cmake de estilo antiguo a menos que sea necesario (ese camino es una tierra de pesadillas)


¿Cómo expreso que el ejecutable principal se compilará con g++ y una biblioteca anidada con gcc?

Tu última pregunta realmente no tiene sentido.

 avatar Nov 06 '2020 18:11

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

https://gitlab.kitware.com/cmake/community/wikis/doc/cmake/Useful-Variables#compilers-and-tools

cmake usa la extensión para elegir el compilador, así que simplemente nombre sus archivos .c.

Puedes 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++.

duncan avatar Oct 11 '2011 11:10 duncan