Я просто хочу отладить код, работающий в Linux, и мне нужна отладочная сборка ( -O0 -ggdb
). Итак, я добавил эти вещи в свой CMakeLists.txt
:
set(CMAKE_BUILD_TYPE DEBUG)
set(CMAKE_C_FLAGS "-O0 -ggdb")
set(CMAKE_C_FLAGS_DEBUG "-O0 -ggdb")
set(CMAKE_C_FLAGS_RELEASE "-O0 -ggdb")
set(CMAKE_CXX_FLAGS "-O0 -ggdb")
set(CMAKE_CXX_FLAGS_DEBUG "-O0 -ggdb")
set(CMAKE_CXX_FLAGS_RELEASE "-O0 -ggdb")
Когда я пытался скомпилировать, я включил подробное использование make VERBOSE=1
И я наблюдал результат, например
... /usr/bin/c++ -D_BSD_SOURCE **-O0 -ggdb** -Wnon-virtual-dtor
-Wno-long-long -ansi -Wundef -Wcast-align -Wchar-subscripts -Wall -W
-Wpointer-arith -Wformat-security -fno-exceptions -DQT_NO_EXCEPTIONS
-fno-check-new -fno-common -Woverloaded-virtual -fno-threadsafe-statics
-fvisibility=hidden -fvisibility-inlines-hidden **-g -O2**
-fno-reorder-blocks -fno-schedule-insns -fno-inline ...
Судя по всему, код скомпилирован, "-g -O2"
а мне это не нужно. Как заставить его использовать "-O0 -ggdb"
только?
Ответы:
Вы должны установить флаги после того, как в
project
команде в вашем CMakeLists.txt.Кроме того, если вы вызываете
include(${QT_USE_FILE})
илиadd_definitions(${QT_DEFINITIONS})
, вам следует включить этиset
команды после команд Qt, поскольку они добавят дополнительные флаги. Если это так, то вы , возможно , просто хотите добавить свои флаги на те , Qt, поэтому изменения к примеруисточник
QT_NO_EXCEPTIONS
в ваших флагах, поэтому немного расширил свой ответ. Я предполагаю, что${QT_DEFINITIONS}
это добавление-g -O2
.set
команд после команд Qt решает проблему. Большое спасибо.Самое простое решение, которое у меня отлично работает, это следующее:
CMake добавит их ко всем флагам конфигурации. Просто не забудьте очистить кеш CMake.
источник
CMAKE_CXX_FLAGS_DEBUG
и т. Д.), То его включенияCXXFLAGS
(и, таким образом, внедрения вCMAKE_CXX_FLAGS
) на самом деле недостаточно для передачи параметра компилятору. Конфигурация для каждого типа сборки имеет приоритет над вводом пользователя.Вы должны изменить флаги по умолчанию cmake C / CXX.
По
CMAKE_BUILD_TYPE={DEBUG/MINSIZEREL/RELWITHDEBINFO/RELEASE}
введенным в основнойCMakeLists.txt
один из:Для C
Для C ++
Это переопределит значения, определенные в CMakeCache.txt.
источник
В системах Unix для нескольких проектов я добавил эти строки в CMakeLists.txt, и он успешно компилировался, потому что базовые ( / usr / include ) и локальные включения ( / usr / local / include ) помещаются в отдельные каталоги:
Он добавляет правильный каталог, включая пути для флагов компилятора C и C ++ и правильный путь к каталогу для флагов компоновщика.
Примечание: компилятор C ++ (c ++) не поддерживает -L, поэтому мы должны использовать CMAKE_EXE_LINKER_FLAGS
источник
include_directories
вместо-I
флага?CMAKE_CXX_FLAGS
, из-за чего они игнорировались. Теперь, когда я разместил их наCMAKE_EXE_LINKER_FLAGS
основе вашего ответа, они работают нормально.