Налагодження проти випуску в CMake


435

У проекті, складеному GCC,

  • Як запустити CMake для кожного цільового типу (налагодження / випуск)?
  • Як вказати налагодження та випустити прапорці C / C ++ за допомогою CMake?
  • Як я можу висловити, що головний виконуваний файл буде складений з g++однією вкладеною бібліотекою gcc?

Відповіді:


657

З CMake, як правило, рекомендується робити збірку "з джерела" . Створіть своє CMakeLists.txtв корені свого проекту. Потім з кореня вашого проекту:

mkdir Release
cd Release
cmake -DCMAKE_BUILD_TYPE=Release ..
make

А для Debug(знову ж із кореня вашого проекту):

mkdir Debug
cd Debug
cmake -DCMAKE_BUILD_TYPE=Debug ..
make

Release/ Debugдодасть відповідні прапори для вашого компілятора. Є також RelWithDebInfoі MinSizeRelбудують конфігурації.


Ви можете змінити / додати до прапорів, вказавши файл ланцюжка інструментів, у який можна додати CMAKE_C_FLAGS_DEBUGта CMAKE_C_FLAGS_RELEASEзмінні, наприклад:

set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Wall")

Докладніше див. У CMAKE_BUILD_TYPE .


Щодо вашого третього запитання, я не впевнений, що саме ви задаєте. CMake повинен автоматично виявляти і використовувати компілятор, відповідний для різних вихідних файлів.


3
Ви також можете зробити cmake -i ..замість цього cmake працюватиме інтерактивно, запитуючи, який тип збірки ви хочете (None, Release, Debug, MinSizeRel, RelWithDebInfo).
thiagowfx

5
@thiagowfx -iрезультати опції в цьому повідомленні про помилку: The "cmake -i" wizard mode is no longer supported.. Я використовую cmake 3.7.1
Philipp Claßen

3
Приємне спостереження. Здається, його застаріли з моменту версії 3.0.0. Довідково .
thiagowfx

7
Це НЕ з вихідної збірки, якщо ви створюєте підкаталог! Радимо створити каталог збірки за межами / над вихідним каталогом.
Віктор Ламойн

Зауважте, що якщо CMAKE_BUILD_TYPEне встановлено, cmake не вибере тип збірки за замовчуванням, отже, створений командний рядок компілятора не буде відповідати жодній конфігурації збірки.
Девід

23

Для налагодження / випуску прапорів див. CMAKE_BUILD_TYPEЗмінну (передаєш її як cmake -DCMAKE_BUILD_TYPE=value). Він приймає такі значення, як Release, Debugі т.д.

https://gitlab.kitware.com/cmake/community/wikis/doc/cmake/Useful-Variables#compilers-and-tools

cmake використовує розширення для вибору компілятора, тому просто назвіть ваші файли .c.

Ви можете змінити це за допомогою різних налаштувань:

Наприклад:

set_source_files_properties(yourfile.c LANGUAGE CXX) 

Буде компілювати файли .c з g ++. Посилання вище також показує, як вибрати певний компілятор для C / C ++.


16

Замість того, щоб CMAKE_CXX_FLAGSбезпосередньо маніпулювати рядками (що можна зробити красивіше за допомогою string(APPEND CMAKE_CXX_FLAGS_DEBUG " -g3")btw), ви можете використовувати add_compiler_options:

add_compile_options(
  "-Wall" "-Wpedantic" "-Wextra" "-fexceptions"
  "$<$<CONFIG:DEBUG>:-O0;-g3;-ggdb>"
)

Це додало б зазначені попередження до всіх типів збірки, але лише задані відладочні прапори до DEBUGзбірки. Зауважте, що параметри компіляції зберігаються у вигляді списку CMake, який є лише рядком, що розділяє його елементи крапкою з комою ;.


2
Не list(APPEND CMAKE_CXX_FLAGS_DEBUG "-g3")додати крапку з комою перед тим, як -g3 припинить команду та запустить нову команду -g3, яка, безумовно, не вдасться?
cburn11

Ви маєте рацію CMAKE_CXX_FLAGS- це не список cmake, а рядок пробілів командного рядка, розділених пробілом. Я вважаю таку поведінку непослідовною ...
sebastian

add_compile_options () є акуратним. Він доповнюється add_link_options () для того, коли вам потрібно додати параметри до також посилання, наприклад -fsanitize = address.
Боуї Оуенс

1
Це все-таки належний шлях до 2020 / cmake 3.17? Цей останній рядок виглядає противно
Джей

8

Якщо ви хочете створити іншу конфігурацію без регенерації, якщо використовуєте, ви також можете запустити cmake --build {$PWD} --config <cfg>Інструменти для багатоконфігурації, виберіть <cfg>напр. Налагодження, випуск, MinSizeRel, RelWithDebInfo

https://cmake.org/cmake/help/v2.8.11/cmake.html#opt%3a--builddir


Я намагався грати з --configваріантом без жодного результату. Це не впливає на $<CONFIG>змінну як-DCMAKE_BUILD_TYPE= і на неї.
loshad vtapkah

5

// CMakeLists.txt: випуск

set(CMAKE_CONFIGURATION_TYPES "Release" CACHE STRING "" FORCE)

// CMakeLists.txt: налагодження

set(CMAKE_CONFIGURATION_TYPES "Debug" CACHE STRING "" FORCE)

10
я не розумію, за що це голосування не вдається, це справжній код, який використовується у виробництві, до речі, мені все одно.
sailfish009

5
Можливо тому, що згідно з документами CMake CMAKE_CONFIGURATION_TYPESмістяться можливі значення для CMAKE_BUILD_TYPE. Тому слід встановити останнє, як підказують інші відповіді. Можливо, ваше рішення працює, оскільки воно обмежує можливі варіанти того, який ви хотіли б мати.
bjhend

2
Оновити, оскільки це спрацює. Мені подобається якийсь CMake, але є химерності, і іноді вам потрібно використовувати великий молоток, щоб справи працювали. У мене є проекти, які з тих чи інших причин відхилять прапор командного рядка.
cory.todd

Ось деяка додаткова інформація про те, чому установка не може працювати: stackoverflow.com/a/24470998/3196753
tresf
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.