Отладка против Релиза в CMake
Проблема компиляции проекта на GCC с использованием CMake
В своем проекте, скомпилированном с помощью GCC, я столкнулся с несколькими вопросами, связанными с использованием CMake:
- Как запустить CMake для каждого типа сборки (debug/release)?
- Как задать флаги компиляции для отладочной и релизной версий C/C++ с использованием CMake?
- Как указать, что основной исполняемый файл будет компилироваться с помощью
g++
, а одна из вложенных библиотек — с помощьюgcc
?
Я был бы признателен за любую помощь или примеры решения этих вопросов.
4 ответ(ов)
Для того чтобы настроить конфигурации сборки в CMake, необходимо корректно использовать команду set()
с переменной CMAKE_CONFIGURATION_TYPES
. В вашем примере кода указаны две разные конфигурации: одна для релиза, а другая для отладки.
Если вы хотите задать только конфигурацию "Release", вы можете использовать следующий код в вашем CMakeLists.txt
:
set(CMAKE_CONFIGURATION_TYPES "Release" CACHE STRING "" FORCE)
Это указывает CMake, что вы хотите использовать только конфигурацию сборки "Release", а другие конфигурации (например, "Debug") не будут доступны.
Если же вам нужна конфигурация "Debug", то используйте аналогичный код:
set(CMAKE_CONFIGURATION_TYPES "Debug" CACHE STRING "" FORCE)
Таким образом, в зависимости от ваших нужд, вы можете включить только одну из этих конфигураций, что может быть полезно в определённых сценариях, когда вам не нужны другие настройки сборки.
Помните, что для многоцелевых сборок (например, при использовании Visual Studio) лучше оставить обе конфигурации доступными, чтобы вы могли переключаться между ними. В таком случае, не стоит переопределять CMAKE_CONFIGURATION_TYPES
только одним значением. Вместо этого можно задать оба:
set(CMAKE_CONFIGURATION_TYPES "Debug;Release" CACHE STRING "Configurations" FORCE)
Это обеспечит доступ к обеим конфигурациям при сборке проекта.
Если вы хотите собрать другую конфигурацию без повторной генерации, вы можете воспользоваться командой cmake --build {$PWD} --config <cfg>
. Для инструментов с поддержкой нескольких конфигураций выберите <cfg>
, например: Debug, Release, MinSizeRel, RelWithDebInfo.
Более подробную информацию можно найти в документации CMake: CMake Documentation.
Для настройки флагов сборки (debug/release) используйте переменную CMAKE_BUILD_TYPE
, которую можно задать при вызове CMake, например, с помощью команды 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++.
Вместо того чтобы манипулировать строками CMAKE_CXX_FLAGS
напрямую (что можно было бы сделать более красиво, используя string(APPEND CMAKE_CXX_FLAGS_DEBUG " -g3")
), вы можете воспользоваться add_compile_options
:
add_compile_options(
"-Wall" "-Wpedantic" "-Wextra" "-fexceptions"
"$<$<CONFIG:DEBUG>:-O0;-g3;-ggdb>"
)
Это добавит указанные предупреждения ко всем типам сборок, но только заданные флаги отладки будут применены к сборке DEBUG
. Обратите внимание, что опции компилятора хранятся в виде списка CMake, который представляет собой строку с элементами, разделёнными точками с запятой ;
.
Как вывести список символов из .so файла?
Разница между использованием Makefile и CMake для компиляции кода?
Разница между const int*, const int * const и int * const?
В чём разница между g++ и gcc?
`unsigned int` против `size_t`: когда и что использовать?