Простая программа на C ++ хорошо работает в CMake с Debug Config, но завершается неудачно с выпуском - PullRequest
0 голосов
/ 24 октября 2018

У меня есть эта простая программа на C ++:

#include <iostream>
int main(int argc, char *argv[])
{
   std::cout << "Hello Build Type!" << std::endl;
   std::cin.get();
   return 0;
}

Я могу собрать ее без проблем, используя команду CMake: cmake --build .

с CmakeLists.txt следующим образом:

cmake_minimum_required(VERSION 3.5)
set(CMAKE_CONFIGURATION_TYPES DEBUG)

project (build_type CXX)
add_executable(cmake_examples_build_type main.cpp)

Однако, когда я изменяю CMAKE_CONFIGURATION_TYPES на RELEASE, я получаю эту ошибку при сборке с cmake --build .

Сборка начата 24.10.2008 10:35:38AM.
Проект "C: \ Users \ ialkeilani \ OneDrive - Ushrauto \ temp \ cmake-examples-master \ 01-basic \ F-build-type \ build \ ALL_BUILD.vcxproj" на узле 1 (цели по умолчанию).
Проект "C: \ Users \ ialkeilani \ OneDrive - Ushrauto \ temp \ cmake-examples-master \ 01-basic \ F-build-type \ build \ ALL_BUILD.vcxproj" (1) строит
"C: \ Users \ ialkeilani \ OneDrive
- Ushrauto \ temp \ cmake-examples-master \ 01-basic \ F-build-type \ build \ ZERO_CHECK.vcxproj "(2) на узле 1 (цели по умолчанию).
C: \ Program Files (x86) \ MSBuild \ Microsoft.Cpp \ v4.0 \ V120 \ Microsoft.Cpp.Platform.targets (61,5): ошибка MSB8013: этот проект не содержит комбинацию конфигурации и платформыDebug | Win32.[C: \ Users \ ialkeilani \ OneDrive - Ushrauto \ temp \ cmake-examples-master \ 01-basic \ F-build-type \ build \ ZERO_CHECK.vcxproj] Готовый строительный проект "C: \ Users \ ialkeilani \ OneDrive \ OneDrive - Ушрауто\ temp \ cmake-examples-master \ 01-basic \ F-build-type \ build \ ZERO_CHECK.vcxproj "(цели по умолчанию) - СБОЙ.

Готово Создание проекта" C: \ Users \ ialkeilani \ "OneDrive - Ushrauto \ temp \ cmake-examples-master \ 01-basic \ F-build-type \ build \ ALL_BUILD.vcxproj "(цели по умолчанию) - FAILED.

Build FAILED.

"C: \ Users \ ialkeilani \ OneDrive - Ushrauto \ temp \ cmake-examples-master \ 01-basic \ F-build-type \ build \ ALL_BUILD.vcxproj" (цель по умолчанию) (1) -> "C: \Пользователи \ ialkeilani \ OneDrive - Ushrauto \ temp \ cmake-examples-master \ 01-basic \ F-build-type \ build \ ZERO_CHECK.vcxproj "(цель по умолчанию) (2) -> (цель PlatformPrepareForBuild) -> C: \Программные файлы (x86) \ MSBuild \ Microsoft.Cpp \ v4.0 \ V120 \ Microsoft.Cpp.Platform.targets (61,5): ошибка MSB8013: этот проект не содержит комбинацию конфигурации и платформы Deошибка | Win32.[C: \ Users \ ialkeilani \ OneDrive - Ushrauto \ temp \ cmake-examples-master \ 01-basic \ F-build-type \ build \ ZERO_CHECK.vcxproj]

0 Предупреждение (я)
1 Ошибка (и)

Истекшее время 00: 00: 00.18

Более того, когда я пытаюсь построить с использованием MSVC с помощью этой команды: msbuild build_type.sln /p:configuration=release

buildзаканчивается нормально, без проблем.

Может кто-нибудь объяснить мне, почему CMake не может создать конфигурацию выпуска, в то время как MSVC не имеет проблем?

Запуск MS Visual Studio 2013 и CMake 3.5.2

Ответы [ 2 ]

0 голосов
/ 05 января 2019

Visual Studio является генератором "нескольких конфигураций", следовательно:

Установка CMAKE_BUILD_TYPE не имеет никакого эффекта.Вы можете убедиться в этом, открыв сгенерированное решение: все конфигурации по-прежнему доступны.

Настройка CMAKE_CONFIGURATION_TYPES=Release является правильным способом: открытие сгенерированного решения в IDE только позволит вам выбрать конфигурацию «Release».Построение вашего примера будет прекрасно работать в среде Visual Studio.

Однако в CMake, похоже, есть ошибка в сочетании с генератором Visual Studio при запуске cmake --build . Изменение команды на cmake --build . --config Release сработает.Похоже, что это регрессия в CMake, так как раньше это работало.Я столкнулся с этой конкретной проблемой сам после недавнего обновления моей среды сборки.

Кстати, это действительно происходит только с Visual Studio.Я не видел этой проблемы с XCode, который также является генератором "нескольких конфигураций".

0 голосов
/ 24 октября 2018

Вы должны использовать опцию ниже вместо CMAKE_CONFIGURATION_TYPES:

CMAKE_BUILD_TYPE

Это может быть установлено либо через cmake:

cmake -DCMAKE_BUILD_TYPE=Debug <cmake-source-tree>

, либо с помощью ccmake:

ccmake <cmake-source-tree>

enter image description here

Обратите внимание, что сначала необходимо выполнить настройку (как показано выше), а затем выполнить этап сборки.То есть:

cmake -DCMAKE_BUILD_TYPE=<Release|Debug> <cmake-source-tree>
make

.если вы делаете свою сборку в пути к своему проекту, но подумайте об использовании сборки из исходного кода, как это предложено CMake.

...