Установите параметры CFLAGS и CXXFLAGS с помощью CMake

88

Я просто хочу отладить код, работающий в 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"только?

Majie
источник
1
Если вам нужна отлаживаемая сборка, просто выполните настройку отладки в командной строке. "cmake -DCMAKE_BUILD_TYPE = Отладка". В итоговой сборке будут включены флаги отладки для данной системы сборки. Нет причин изменять сам файл cmake. Вы также можете отправить значение CMAKE_C_FLAGS с другим аргументом -D.
Atifm

Ответы:

83

Вы должны установить флаги после того, как в projectкоманде в вашем CMakeLists.txt.

Кроме того, если вы вызываете include(${QT_USE_FILE})или add_definitions(${QT_DEFINITIONS}), вам следует включить эти setкоманды после команд Qt, поскольку они добавят дополнительные флаги. Если это так, то вы , возможно , просто хотите добавить свои флаги на те , Qt, поэтому изменения к примеру

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0 -ggdb")
Fraser
источник
Я поставил эти флаги после команды проекта. Но вывод такой же.
Majie
Я только что заметил QT_NO_EXCEPTIONSв ваших флагах, поэтому немного расширил свой ответ. Я предполагаю, что ${QT_DEFINITIONS}это добавление -g -O2.
Fraser
1
Да, вот оно что. Размещение этих setкоманд после команд Qt решает проблему. Большое спасибо.
Majie
18

Самое простое решение, которое у меня отлично работает, это следующее:

export CFLAGS=-ggdb
export CXXFLAGS=-ggdb

CMake добавит их ко всем флагам конфигурации. Просто не забудьте очистить кеш CMake.

Virus_7
источник
3
Установка флагов в такой среде - единственный способ сделать это, не изменяя файл CMakeLists.txt. Обратите внимание, что значение среды считывается только при первой конфигурации, а затем помещается в кеш, поэтому, если вы хотите изменить это, вам необходимо очистить кеш CMake и повторно запустить шаг настройки с новыми значениями в env. Документы: cmake.org/cmake/help/latest/envvar/CFLAGS.html cmake.org/cmake/help/latest/envvar/CXXFLAGS.html
bleater
3
Это не «самый простой», это единственно правильный способ сделать это.
Слава
Незначительная загвоздка: если генератор настраивает конкретный флаг для определенного типа сборки (например, в CMAKE_CXX_FLAGS_DEBUG и т. Д.), То его включения CXXFLAGS(и, таким образом, внедрения в CMAKE_CXX_FLAGS) на самом деле недостаточно для передачи параметра компилятору. Конфигурация для каждого типа сборки имеет приоритет над вводом пользователя.
Ext3h,
15

Вы должны изменить флаги по умолчанию cmake C / CXX.

По CMAKE_BUILD_TYPE={DEBUG/MINSIZEREL/RELWITHDEBINFO/RELEASE} введенным в основной CMakeLists.txtодин из:

Для C

set(CMAKE_C_FLAGS_DEBUG "put your flags")
set(CMAKE_C_FLAGS_MINSIZEREL "put your flags")
set(CMAKE_C_FLAGS_RELWITHDEBINFO "put your flags")
set(CMAKE_C_FLAGS_RELEASE "put your flags")

Для C ++

set(CMAKE_CXX_FLAGS_DEBUG "put your flags")
set(CMAKE_CXX_FLAGS_MINSIZEREL "put your flags")
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "put your flags")
set(CMAKE_CXX_FLAGS_RELEASE "put your flags")

Это переопределит значения, определенные в CMakeCache.txt.

Карл-Эрвин
источник
который отменяет текущие флаги cmake. поэтому он прерывает отладку, если вы сами не добавите флаг -g (gcc)
activedecay
Есть ли то же самое с синтаксисом "Modern Cmake"?
Сандберг
6

В системах Unix для нескольких проектов я добавил эти строки в CMakeLists.txt, и он успешно компилировался, потому что базовые ( / usr / include ) и локальные включения ( / usr / local / include ) помещаются в отдельные каталоги:

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -I/usr/local/include -L/usr/local/lib")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I/usr/local/include")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L/usr/local/lib")

Он добавляет правильный каталог, включая пути для флагов компилятора C и C ++ и правильный путь к каталогу для флагов компоновщика.

Примечание: компилятор C ++ (c ++) не поддерживает -L, поэтому мы должны использовать CMAKE_EXE_LINKER_FLAGS

сбз
источник
3
Не лучше ли использовать include_directoriesвместо -Iфлага?
Tejas Kale
Огромное спасибо. Я помещал свои флаги компоновщика CMAKE_CXX_FLAGS, из-за чего они игнорировались. Теперь, когда я разместил их на CMAKE_EXE_LINKER_FLAGSоснове вашего ответа, они работают нормально.
Нахиян