Встановіть параметри 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"лише?


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, тому змініть на eg

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0 -ggdb")

Я поставив ці прапори після команди проекту. Але результат однаковий.
majie

Я щойно помітив QT_NO_EXCEPTIONSу ваших прапорах, тому трохи розширив свою відповідь. Я здогадуюсь, що ${QT_DEFINITIONS}це додає -g -O2.
Фрейзер,

1
Так, це все. Постановка цих setкоманд після команд Qt вирішує проблему. Дуже дякую.
majie

18

Для мене найпростішим рішенням є прекрасне:

export CFLAGS=-ggdb
export CXXFLAGS=-ggdb

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


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

Ви повинні змінити прапори за замовчуванням C / CXX.

Відповідно до CMAKE_BUILD_TYPE={DEBUG/MINSIZEREL/RELWITHDEBINFO/RELEASE} основного CMakeLists.txtз:

Для С

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

Для С ++

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, і він успішно скомпілювався, оскільки base ( / usr / include ) та local включені ( / 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основі вашої відповіді, вони працюють чудово.
Нахіян
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.