5

Отладка против Релиза в CMake

17

Проблема компиляции проекта на GCC с использованием CMake

В своем проекте, скомпилированном с помощью GCC, я столкнулся с несколькими вопросами, связанными с использованием CMake:

  1. Как запустить CMake для каждого типа сборки (debug/release)?
  2. Как задать флаги компиляции для отладочной и релизной версий C/C++ с использованием CMake?
  3. Как указать, что основной исполняемый файл будет компилироваться с помощью g++, а одна из вложенных библиотек — с помощью gcc?

Я был бы признателен за любую помощь или примеры решения этих вопросов.

4 ответ(ов)

0

Для того чтобы настроить конфигурации сборки в 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)

Это обеспечит доступ к обеим конфигурациям при сборке проекта.

0

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

Более подробную информацию можно найти в документации CMake: CMake Documentation.

0

Для настройки флагов сборки (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++.

0

Вместо того чтобы манипулировать строками 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, который представляет собой строку с элементами, разделёнными точками с запятой ;.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь