Существует ли кросс-платформенный способ задать тип сборки проекта, создаваемого с помощью cmake?

#linux #windows #cmake #build-type

Вопрос:

У CMake и VS, похоже, довольно странные отношения. Я пытаюсь понять, почему настройка CMAKE_BUILD_TYPE не влияет на сборку созданного решения Visual Studio и проекта, которые являются его частью.

Например (с использованием графического интерфейса CMake) у меня есть следующее в моем CMakeLists.txt (это чисто для целей отладки):

 if(NOT CMAKE_BUILD_TYPE)
    message(WARNING "CMAKE_BUILD_TYPE is not set. Fallback to default: ReleasenSupported build types:n   - Releasen   - Debug")
    set(CMAKE_BUILD_TYPE "Release")
endif()
 

Поскольку я не устанавливаю CMAKE_BUILD_TYPE в графическом интерфейсе, переменная пуста и, следовательно, внутренне установлена в Release значение .

Однако после завершения этапа настройки в таблице с установленными переменными (графический интерфейс) я ясно вижу

 CMAKE_CXX_FLAGS_RELEASE  /O2 /Ob2 /DNDEBUG
CMAKE_C_FLAGS_RELEASE    /O2 /Ob2 /DNDEBUG
 

среди других переменных, значения которых указывают на то, что я четко настроил Debug сборку.

Помимо ручной настройки CMAKE_CXX_FLAGS и т. Д. На основе от платформы к платформе существует ли на самом деле способ легко настроить тип сборки, предпочтительно просто изменив значение CMAKE_BUILD_TYPE ?

Ответ №1:

Если вы говорите об /DNDEBUG этом , это на самом деле указывает на Release сборку.

Это определение означает «Не отлаживать» и вызывает функции, чтобы они не выполнялись. assert() Более подробная информация здесь.

Все остальные флаги управляют уровнями оптимизации, а значения O2 и Ob2 также используются в основном для не отладочных сборок.

Ответ №2:

Причина CMAKE_BUILD_TYPE , по которой это никак не влияет на проект VS, заключается в том, что в отличие от генератора «Unix Makefile» генератор VS является генератором нескольких конфигураций. Это означает, что каждый проект, который вы настраиваете с помощью генератора VS, предоставляет несколько конфигураций одновременно (перезапись, отладка и т. Д.), Но при настройке одного и того же проекта с помощью генератора «Unix Makefile» вам необходимо выбрать одну конфигурацию (или использовать конфигурацию по умолчанию).

Решение о конфигурации было «отложено» для генераторов с несколькими конфигурациями. Для одного генератора конфигурации вы используете

 cmake --build <dir>
 

чтобы построить свой проект, для проекта с несколькими конфигурациями вы используете

 cmake --build <dir> --config <config>
 

( <dir> заменяется каталогом сборки и <config> заменяется Debug Release или одной из других доступных конфигураций в командах.)