Cómo compilar sin optimizaciones -O0 usando CMake

17

Estoy usando Scientific Linux (SL). Estoy tratando de compilar un proyecto que utiliza un montón de archivos C ++ (.cpp).

En el directorio user/project/Build, entro makepara compilar y vincular todos los archivos .cpp. Entonces tengo que ir user/run/y luego escribir./run.sh values.txt

Para depurar con GDB, tengo que ir user/runy luego escribir gdb ../project/Build/bin/Projecty para ejecutar, entro run -Project INPUT/inputfile.txt. Sin embargo, estoy tratando de imprimir el valor de la variable usando p variablename.

Sin embargo, recibo el mensaje s1 = <value optimized out>. He investigado en línea, y parece que necesito compilar sin optimizaciones -O0para resolver esto. ¿Pero dónde ingreso eso? En el CMakeLists? Si es así, ¿qué CMakeLists? ¿El de project/Buildo project/src/project?

usuario4352158
fuente
¿Has intentado simplemente ejecutar cmake nuevamente con el tipo de compilación establecido en DEBUG? p. ej. (del directorio Build)cmake -DCMAKE_BUILD_TYPE=DEBUG ..
steeldriver
1
¿Por qué no se publicó esto en Stack Overflow?
Peter Mortensen

Respuestas:

10

La respuesta de Chip fue útil, sin embargo, dado que la SETlínea sobrescribió CMAKE_CXX_FLAGS_DEBUGesto eliminó el -gvalor predeterminado que causó que mi ejecutable se construyera sin información de depuración. Necesitaba hacer una pequeña modificación adicional a CMakeLists.txt en el directorio de origen del proyecto para obtener un ejecutable creado con información de depuración y -O0 optimizaciones (en la versión 2.8.12.2 de cmake).

Agregué lo siguiente a CMakeLists.txt para agregar -O0y dejar -ghabilitado:

# Add -O0 to remove optimizations when using gcc
IF(CMAKE_COMPILER_IS_GNUCC)
    set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O0")
    set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -O0")
ENDIF(CMAKE_COMPILER_IS_GNUCC)

Esto agrega la -O0optimización a los indicadores ya utilizados para la depuración por CMake y solo se incluye para las compilaciones de GCC si está utilizando un proyecto multiplataforma.

dan
fuente
8

O en el momento de la invocación:

cmake -DCMAKE_BUILD_TYPE=DEBUG \
      -DCMAKE_C_FLAGS_DEBUG="-g -O0" \
      -DCMAKE_CXX_FLAGS_DEBUG="-g -O0"

y luego confirme con:

make VERBOSE=1

para mostrar los comandos de compilación de GCC como se explica en: /programming/5820303/how-do-i-force-make-gcc-to-show-me-the-commands

Probado en Ubuntu 17.04, CMake 3.7.2.

Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
fuente
4

Agregue esto a CMakeLists.txt (el que está en el directorio de origen del proyecto; no toque nada en el directorio de compilación):

SET(CMAKE_CXX_FLAGS_DEBUG "-O0")
SET(CMAKE_C_FLAGS_DEBUG "-O0")

y entonces

$ cmake -DCMAKE_BUILD_TYPE=Debug

trabajará. Alternativamente, solo agregue esto a CMakeLists.txt:

SET(CMAKE_CXX_FLAGS "-O0")
SET(CMAKE_C_FLAGS "-O0")
Chip Christian
fuente