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

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

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

4 ответа

Решение

С 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 строить конфигурации.


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

Многие ответы здесь устарели / плохи. Так что я попытаюсь ответить на него получше. Конечно, я отвечу на этот вопрос в 2020 году, поэтому ожидается, что все изменится.


Как запустить CMake для каждого типа цели (отладка / выпуск)?

Во-первых, Debug/Release называются конфигурациями в cmake (придираться).

Если вы используете один генератор конфигурации (Ninja/Unix-Makefiles)

Затем вам понадобится папка сборки для каждой конфигурации.

Как это:

# Configure the build
cmake -S . -B build/Debug -D CMAKE_BUILD_TYPE=Release

# Actually build the binaries
cmake --build build/Debug

Для генераторов с несколькими конфигурациями это немного отличается (Ninja Multi-Config, Visual Studio)

# Configure the build
cmake -S . -B build

# Actually build the binaries
cmake --build build --config Debug

Если вам интересно, почему это необходимо, так это потому, что cmake не является системой сборки. Это система мета-сборки (IE - система сборки, которая создает системы сборки). В основном это результат обработки систем сборки, которые поддерживают несколько конфигураций в одной сборке. Если вам нужно более глубокое понимание, я бы посоветовал прочитать немного о cmake в книге Крейга Скотта "Professional CMake: A Practical Guide"


Как указать флаги отладки и выпуска C/C++ с помощью CMake?

В современной практике используются цели и свойства.

Вот пример:

add_library(foobar)

# Add this compile definition for debug builds, this same logic works for
# target_compile_options, target_link_options, etc.
target_compile_definitions(foobar PRIVATE
    $<$<CONFIG:Debug>:
        FOOBAR_DEBUG=1
    >
)

ПРИМЕЧАНИЕ. Как я использую выражения генератора для указания конфигурации! Использование CMAKE_BUILD_TYPE приведет к плохим сборкам для любого генератора с несколькими конфигурациями!

Более того, иногда вам нужно настроить все глобально, а не только для одной цели. Используйте add_compile_definitions, add_compile_options и т. Д. Эти функции поддерживают выражения генератора. Не используйте cmake в старом стиле, если вам не нужно (этот путь - земля кошмаров)


Как я могу сказать, что основной исполняемый файл будет скомпилирован с помощью g++, а одна вложенная библиотека - с помощью gcc?

Ваш последний вопрос действительно не имеет смысла.

Для флагов отладки / выпуска см. CMAKE_BUILD_TYPE переменная (вы передаете это как cmake -DCMAKE_BUILD_TYPE=value). Это принимает значения как Release, Debug, так далее.

http://cmake.org/Wiki/CMake_Useful_Variables

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_compiler_options:

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

Это добавит указанные предупреждения ко всем типам сборки, но только к указанным флагам отладки. DEBUG строить. Обратите внимание, что параметры компиляции хранятся в виде списка CMake, который представляет собой просто строку, разделяющую ее элементы точкой с запятой ;,

// CMakeLists.txt: release

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

// CMakeLists.txt: debug

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

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

https://cmake.org/cmake/help/v2.8.11/cmake.html

Другие вопросы по тегам