Как скомпилировать без оптимизации -O0 с помощью CMake

17

Я использую Scientific Linux (SL). Я пытаюсь скомпилировать проект, который использует кучу файлов C ++ (.cpp).

В каталоге user/project/Buildя ввожу, makeчтобы скомпилировать и связать все файлы .cpp. Затем я должен пойти user/run/и затем набрать./run.sh values.txt

Для отладки с помощью GDB мне нужно перейти, user/runа затем ввести gdb ../project/Build/bin/Projectи запустить, я ввожу run -Project INPUT/inputfile.txt. Тем не менее, я пытаюсь распечатать значение переменной с помощью p variablename.

Тем не менее, я получаю сообщение s1 = <value optimized out>. Я провел некоторые исследования в Интернете, и мне кажется, что мне нужно компилировать без оптимизации, -O0чтобы решить эту проблему. Но куда мне это ввести? В CMakeLists? Если да, то какие CMakeLists? Тот, в project/Buildили project/src/project?

user4352158
источник
Вы пробовали просто запустить cmake снова с типом сборки, установленным на DEBUG? например (из каталога Build)cmake -DCMAKE_BUILD_TYPE=DEBUG ..
Steeldriver
1
Почему это не опубликовано в переполнении стека?
Питер Мортенсен

Ответы:

10

Ответ Чипа был полезен, однако, так как SETстрока перезаписала CMAKE_CXX_FLAGS_DEBUGэто, удалил -gзначение по умолчанию, из-за которого мой исполняемый файл был собран без отладочной информации. Мне нужно было сделать небольшую дополнительную модификацию CMakeLists.txt в исходном каталоге проекта, чтобы получить исполняемый файл, созданный с информацией об отладке и -O0 оптимизацией (в версии 2.8.12.2 для cmake).

Я добавил следующее в CMakeLists.txt, чтобы добавить -O0и оставить -gвключенным:

# 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)

Это добавляет -O0оптимизацию к флагам, уже используемым для отладки CMake, и включается только для сборок GCC, если вы используете кроссплатформенный проект.

Дан
источник
8

Или во время вызова:

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

и затем подтвердите с помощью:

make VERBOSE=1

чтобы показать команды сборки GCC, как объяснено по адресу: /programming/5820303/how-do-i-force-make-gcc-to-show-me-the-commands

Протестировано на Ubuntu 17.04, CMake 3.7.2.

Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
источник
4

Добавьте это в CMakeLists.txt (тот, что находится в исходной директории проекта; ничего не трогайте в директории сборки):

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

а потом

$ cmake -DCMAKE_BUILD_TYPE=Debug

буду работать. В качестве альтернативы просто добавьте это в CMakeLists.txt:

SET(CMAKE_CXX_FLAGS "-O0")
SET(CMAKE_C_FLAGS "-O0")
Чип Кристиан
источник