Отладка против выпуска в 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