#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
или одной из других доступных конфигураций в командах.)