Отладка против выпуска в CMake

437

В скомпилированном проекте GCC,

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

Ответы:

660

С 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 должен автоматически обнаружить и использовать компилятор, подходящий для ваших разных исходных файлов.

kb1ooo
источник
3
Вы также можете сделать cmake -i ..вместо этого, поэтому cmake будет работать в интерактивном режиме, спрашивая вас, какой тип сборки вы хотите (Нет, 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 ++.

Duncan
источник
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 , но строка разделенных пробелами флагов командной строки. Я нахожу это поведение непоследовательным ...
Себастьян
add_compile_options () аккуратный. Он дополняется add_link_options () для случаев, когда вам также необходимо добавить опции для компоновщика, такие как -fsanitize = address.
Боуи Оуэнс
1
Это все еще правильный путь в 2020 / cmake 3.17? Эта последняя строка выглядит противно
Джей
8

Если вы хотите создать другую конфигурацию без регенерации, при использовании вы также можете запустить cmake --build {$PWD} --config <cfg>Для инструментов с несколькими конфигурациями выберите <cfg>ex. Отладка, выпуск, MinSizeRel, RelWithDebInfo

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

Рассел Уотерс
источник
Я пытался играть с --configопцией без какого-либо результата. Это не влияет на $<CONFIG>переменную, как -DCMAKE_BUILD_TYPE=делает.
Лошадь втапках
5

// CMakeLists.txt: release

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

// CMakeLists.txt: debug

set(CMAKE_CONFIGURATION_TYPES "Debug" CACHE STRING "" FORCE)
sailfish009
источник
10
Я не понимаю, почему за это проголосовали, это реальный код, который используется в производстве, кстати, мне все равно.
sailfish009
5
Может быть, потому что в соответствии с CMake документы CMAKE_CONFIGURATION_TYPESсодержат возможные значения для CMAKE_BUILD_TYPE. Таким образом, вы должны установить последний, как предлагают другие ответы. Возможно, ваше решение работает, потому что оно ограничивает возможные варианты выбора, который вы хотели бы иметь.
Bjhend
2
Upvote, потому что это будет работать. Я люблю меня немного CMake, но есть причуды, и иногда вам нужно использовать большой молоток, чтобы заставить вещи работать. У меня есть несколько проектов, которые по тем или иным причинам отклонят флаг командной строки.
cory.todd
Вот дополнительная информация о том, почему настройка может не работать: stackoverflow.com/a/24470998/3196753
tresf,