Проблемы генерации решения для VS 2017 с CMake

Поэтому я установил Visual Studio 2017 вчера. Я также установил CMake 3.7.2, который поддерживает VS 2017.

Моя VS установка с Game development with C++ рабочий процесс + несколько других компонентов:

individual_components

Я также добавил материал CMake (но я не думаю, что он мне даже понадобился - поскольку я использую CMake как самостоятельный инструмент для генерации решений VS) и MSBuild (у меня был msbuild.exe даже до добавления этого компонента - поэтому не уверен, что именно делает этот дополнительный компонент).

С VS 2015 я смог просто запустить cmake . из обычной командной строки для решения.

С VS 2017 рабочий процесс меняется - я прочитал этот пост от Microsoft.

Поэтому я попробовал следующее:

  • Я открыл Developer Command Prompt for VS 2017 и от этого я побежал cmake . -G "NMake Makefiles", Потом работает cmake --build . все правильно скомпилировал.
  • Когда я попробовал следующее в приглашении: cmake . -G "Visual Studio 15 2017 Win64" Для форсирования создания решения я получил следующие ошибки:

    -- The C compiler identification is unknown
    -- The CXX compiler identification is unknown
    CMake Error at CMakeLists.txt:3 (project):
      No CMAKE_C_COMPILER could be found.
    CMake Error at CMakeLists.txt:3 (project):
      No CMAKE_CXX_COMPILER could be found.
    -- Configuring incomplete, errors occurred!
    

Я также попытался настроить среду с помощью vswhere.exe и запустить vcvarsall.bat как это:

"C: \ Program Files (x86) \ Microsoft Visual Studio \ 2017 \ Community \ VC \ Auxiliary \ Build \ vcvarsall.bat" amd64

и снова я мог генерировать только файлы NMake, а не решение.

Так как я могу получить решение?

И почему cl.exe доклад Version 19.10.25017 когда это в VC\Tools\MSVC\14.10.25017\bin?

8 ответов

Решение

Превращаю мои комментарии в ответ

Ошибка -- The CXX compiler identification is unknown - No CMAKE_CXX_COMPILER could be found. в основном это означает, что CMake не смог скомпилировать простую тестовую программу (что он всегда делает как часть идентификации / проверки компилятора).

Вы можете взглянуть на CMakeFiles\CMakeError.log (относительно вашей директории двоичного вывода), причина ошибки должна быть там.

До сих пор я сталкивался с двумя возможными причинами:

  1. Отсутствуют права администратора. Вы можете попробовать запустить это снова из оболочки, которая имеет права администратора для перекрестной проверки, если ваша Visual Studio была настроена с необходимостью прав администратора.

  2. Отсутствует Windows SDK. Проверьте установку SDK, например, убедитесь, что у вас установлен любой Resource Compiler. Это должно быть в пути, похожем на:

    C:\Program Files (x86)\Microsoft SDKs\Windows\v[some version]\bin\RC.Exe
    

Visual Studio 2017 Установка

Обратите внимание, что Visual Studio может не устанавливать все необходимые пакеты C++, даже когда вы выбираете один из предопределенных пакетов C++ (как я, например, использовал Desktop development with C++ а затем добавил больше пакетов под Individual Components вкладка).

Вот какой выбор работал для меня (VS2017 Community Edition, Windows 10):

Если у вас есть проекты, использующие библиотеки MFC/ATL, вам нужно добавить их в SDKs, libraries, and frameworks подкатегория:

Рекомендации

Я использую Windows 7.... И после того, как @Florian сказал мне в комментариях, чтобы посмотреть в CMakeFiles/CMakeError.log Мне удалось решить проблему!

Вот первый журнал:

Compiling the C compiler identification source file "CMakeCCompilerId.c" failed.
Compiler:  
Build flags: 
Id flags:  

The output was:
1
Microsoft (R) Build Engine version 15.1.548.43366
Copyright (C) Microsoft Corporation. All rights reserved.

Build started 3/10/2017 11:05:24 AM.
Project "D:\doctest\build\CMakeFiles\3.8.0-rc2\CompilerIdC\CompilerIdC.vcxproj" on node 1 (default targets).
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\VC\VCTargets\Platforms\x64\PlatformToolsets\v141\Toolset.targets(36,5): error MSB8036: The Windows SDK version 8.1 was not found. Install the required version of Windows SDK or change the SDK version in the project property pages or by right-clicking the solution and selecting "Retarget solution". [D:\doctest\build\CMakeFiles\3.8.0-rc2\CompilerIdC\CompilerIdC.vcxproj]
Done Building Project "D:\doctest\build\CMakeFiles\3.8.0-rc2\CompilerIdC\CompilerIdC.vcxproj" (default targets) -- FAILED.

Build FAILED.

"D:\doctest\build\CMakeFiles\3.8.0-rc2\CompilerIdC\CompilerIdC.vcxproj" (default target) (1) ->
(Desktop_PlatformPrepareForBuild target) -> 
  C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\VC\VCTargets\Platforms\x64\PlatformToolsets\v141\Toolset.targets(36,5): error MSB8036: The Windows SDK version 8.1 was not found. Install the required version of Windows SDK or change the SDK version in the project property pages or by right-clicking the solution and selecting "Retarget solution". [D:\doctest\build\CMakeFiles\3.8.0-rc2\CompilerIdC\CompilerIdC.vcxproj]

    0 Warning(s)
    1 Error(s)

Time Elapsed 00:00:00.28


Compiling the CXX compiler identification source file "CMakeCXXCompilerId.cpp" failed.
Compiler:  
Build flags: 
Id flags:  

The output was:
1
Microsoft (R) Build Engine version 15.1.548.43366
Copyright (C) Microsoft Corporation. All rights reserved.

Build started 3/10/2017 11:05:24 AM.
Project "D:\doctest\build\CMakeFiles\3.8.0-rc2\CompilerIdCXX\CompilerIdCXX.vcxproj" on node 1 (default targets).
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\VC\VCTargets\Platforms\x64\PlatformToolsets\v141\Toolset.targets(36,5): error MSB8036: The Windows SDK version 8.1 was not found. Install the required version of Windows SDK or change the SDK version in the project property pages or by right-clicking the solution and selecting "Retarget solution". [D:\doctest\build\CMakeFiles\3.8.0-rc2\CompilerIdCXX\CompilerIdCXX.vcxproj]
Done Building Project "D:\doctest\build\CMakeFiles\3.8.0-rc2\CompilerIdCXX\CompilerIdCXX.vcxproj" (default targets) -- FAILED.

Build FAILED.

"D:\doctest\build\CMakeFiles\3.8.0-rc2\CompilerIdCXX\CompilerIdCXX.vcxproj" (default target) (1) ->
(Desktop_PlatformPrepareForBuild target) -> 
  C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\VC\VCTargets\Platforms\x64\PlatformToolsets\v141\Toolset.targets(36,5): error MSB8036: The Windows SDK version 8.1 was not found. Install the required version of Windows SDK or change the SDK version in the project property pages or by right-clicking the solution and selecting "Retarget solution". [D:\doctest\build\CMakeFiles\3.8.0-rc2\CompilerIdCXX\CompilerIdCXX.vcxproj]

    0 Warning(s)
    1 Error(s)

Time Elapsed 00:00:00.13

Казалось мне нужно Windows SDK version 8.1 поэтому я установил его как компонент (была установлена ​​только версия 10). Но потом произошла еще одна ошибка:

Compiling the C compiler identification source file "CMakeCCompilerId.c" failed.
Compiler:  
Build flags: 
Id flags:  

The output was:
1
Microsoft (R) Build Engine version 15.1.548.43366
Copyright (C) Microsoft Corporation. All rights reserved.

Build started 3/10/2017 11:17:21 AM.
Project "D:\doctest\build\CMakeFiles\3.8.0-rc2\CompilerIdC\CompilerIdC.vcxproj" on node 1 (default targets).
PrepareForBuild:
  Creating directory "Debug\".
  Creating directory "Debug\CompilerIdC.tlog\".
InitializeBuildStatus:
  Creating "Debug\CompilerIdC.tlog\unsuccessfulbuild" because "AlwaysCreate" was specified.
ClCompile:
  C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.10.25017\bin\HostX86\x64\CL.exe /c /nologo /W0 /WX- /diagnostics:classic /Od /D _MBCS /Gm- /EHsc /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /Fo"Debug\\" /Fd"Debug\vc141.pdb" /Gd /TC /errorReport:queue CMakeCCompilerId.c
  CMakeCCompilerId.c
Link:
  C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.10.25017\bin\HostX86\x64\link.exe /ERRORREPORT:QUEUE /OUT:".\CompilerIdC.exe" /INCREMENTAL:NO /NOLOGO kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /MANIFEST /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /manifest:embed /PDB:".\CompilerIdC.pdb" /SUBSYSTEM:CONSOLE /TLBID:1 /DYNAMICBASE /NXCOMPAT /IMPLIB:".\CompilerIdC.lib" /MACHINE:X64 Debug\CMakeCCompilerId.obj
LINK : fatal error LNK1104: cannot open file 'ucrtd.lib' [D:\doctest\build\CMakeFiles\3.8.0-rc2\CompilerIdC\CompilerIdC.vcxproj]
Done Building Project "D:\doctest\build\CMakeFiles\3.8.0-rc2\CompilerIdC\CompilerIdC.vcxproj" (default targets) -- FAILED.

Build FAILED.

"D:\doctest\build\CMakeFiles\3.8.0-rc2\CompilerIdC\CompilerIdC.vcxproj" (default target) (1) ->
(Link target) -> 
  LINK : fatal error LNK1104: cannot open file 'ucrtd.lib' [D:\doctest\build\CMakeFiles\3.8.0-rc2\CompilerIdC\CompilerIdC.vcxproj]

    0 Warning(s)
    1 Error(s)

Time Elapsed 00:00:01.04


Compiling the CXX compiler identification source file "CMakeCXXCompilerId.cpp" failed.
Compiler:  
Build flags: 
Id flags:  

The output was:
1
Microsoft (R) Build Engine version 15.1.548.43366
Copyright (C) Microsoft Corporation. All rights reserved.

Build started 3/10/2017 11:17:22 AM.
Project "D:\doctest\build\CMakeFiles\3.8.0-rc2\CompilerIdCXX\CompilerIdCXX.vcxproj" on node 1 (default targets).
PrepareForBuild:
  Creating directory "Debug\".
  Creating directory "Debug\CompilerIdCXX.tlog\".
InitializeBuildStatus:
  Creating "Debug\CompilerIdCXX.tlog\unsuccessfulbuild" because "AlwaysCreate" was specified.
ClCompile:
  C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.10.25017\bin\HostX86\x64\CL.exe /c /nologo /W0 /WX- /diagnostics:classic /Od /D _MBCS /Gm- /EHsc /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /Fo"Debug\\" /Fd"Debug\vc141.pdb" /Gd /TP /errorReport:queue CMakeCXXCompilerId.cpp
  CMakeCXXCompilerId.cpp
Link:
  C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.10.25017\bin\HostX86\x64\link.exe /ERRORREPORT:QUEUE /OUT:".\CompilerIdCXX.exe" /INCREMENTAL:NO /NOLOGO kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /MANIFEST /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /manifest:embed /PDB:".\CompilerIdCXX.pdb" /SUBSYSTEM:CONSOLE /TLBID:1 /DYNAMICBASE /NXCOMPAT /IMPLIB:".\CompilerIdCXX.lib" /MACHINE:X64 Debug\CMakeCXXCompilerId.obj
LINK : fatal error LNK1104: cannot open file 'ucrtd.lib' [D:\doctest\build\CMakeFiles\3.8.0-rc2\CompilerIdCXX\CompilerIdCXX.vcxproj]
Done Building Project "D:\doctest\build\CMakeFiles\3.8.0-rc2\CompilerIdCXX\CompilerIdCXX.vcxproj" (default targets) -- FAILED.

Build FAILED.

"D:\doctest\build\CMakeFiles\3.8.0-rc2\CompilerIdCXX\CompilerIdCXX.vcxproj" (default target) (1) ->
(Link target) -> 
  LINK : fatal error LNK1104: cannot open file 'ucrtd.lib' [D:\doctest\build\CMakeFiles\3.8.0-rc2\CompilerIdCXX\CompilerIdCXX.vcxproj]

    0 Warning(s)
    1 Error(s)

Time Elapsed 00:00:00.60

Так LINK : fatal error LNK1104: cannot open file 'ucrtd.lib' звучит так, как будто мне нужно было установить больше компонентов - и я сделал так:

  • Visual C++ runtime for UWP
  • Windows Universal CRT SDK

И после этого проблема исчезла!

Могу рассказать мой опыт. После чтения CMakeFiles/CMakeError.log обнаружил ошибку

LINK : fatal error LNK1104: cannot open file 'MSVCRTD.lib'

и что важнее - предупреждение

Common7\IDE\VC\VCTargets\Microsoft.CppBuild.targets(402,5):
warning MSB8038: Spectre mitigation is enabled but Spectre mitigated libraries
are not found.
Verify that the Visual Studio Workload includes the Spectre mitigated libraries.  

Вариант 1. У меня нет намерения использовать библиотеки, уменьшенные от Spectre, и я хочу просто восстановить предыдущее поведение сборки.

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

К счастью, нашел ветку на форуме поддержки: https://developercommunity.visualstudio.com/content/problem/348985/installing-wdk-1809-enabled-spectre-mitigation-fla.html

Решение не очень изящное, но работает. Поместите / скопируйте файл с именемDirectory.Build.props в / создайте папку с содержимым:

<Project>
  <PropertyGroup Label="Configuration">
    <SpectreMitigation>false</SpectreMitigation>
  </PropertyGroup>
</Project>

Это отменяет поведение VS по умолчанию и отключает переключатель компилятора /QSpectre.

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

Вариант 2: убедитесь, что установлены библиотеки защиты Spectre

Увидеть:

Если у вас установлен пакет обновления для Windows 10 Creator, он не устанавливает двоичные файлы рабочего стола по умолчанию, чтобы уменьшить размер установки. CMake всегда будет пытаться использовать последний SDK при компиляции, что приведет к сбою, так как будут отсутствовать двоичные файлы, такие как "gdi32.lib" (это первая ошибка, которая возникает у меня).

Microsoft перечисляет это как "Известную проблему", см. Известные проблемы рабочего стола Visual C++.

Пакет обновления для Windows 10 Creators SDK был реорганизован для уменьшения объема установки по умолчанию. Когда вы устанавливаете этот SDK через рабочую нагрузку UWP, он не устанавливает заголовки / библиотеки, необходимые для Win32 C++ Desktop Projects.

Чтобы решить эту проблему, необходимо изменить установку Visual Studio, чтобы включить Windows 10 SDK (10.0.15063.0) для настольного компонента.

Установите Обновление SDK Создателя для Рабочего стола

Я столкнулся с подобной проблемой.

Это было решено сначала снятием флажка "Разработка рабочего стола с C++", а затем еще раз проверкой "Разработка рабочего стола с C++".

Windows 10.0.17134 Build 17134; Сообщество Visual Studio 2017 (15.9.7)

Все необходимые компоненты установлены

В моем случае ( сборка Wireshark) произошла ошибка в неправильном наборе инструментов. CMake определяет v141, а фактическая версия - v140.

cmake -G "Visual Studio 15 2017" -T v140,host=x64 ..

Для меня я установил vs2015 раньше, а компилятор c 2015 года работал раньше, когда я устанавливаю vs2017, получаю ту же ошибку can't find compiler, И когда я бегу cmake .. в команде разработчиков vs2017 это работает. И я могу указать generetor для vs2015 или vs2017, все это работает.

По моему опыту, «базой» этой проблемы рабочего процесса CMake является (в данном случае) действительно вводящее в заблуждение сообщение об ошибке «Не удалось найти CMAKE_C[XX]_COMPILER».

CMakeError.log - это ключ: я увидел там "...Cl.exe /c...", поэтому компилятор был найден (и выполнен)

Моя проблема заключалась в отсутствующем ucrt.lib (хотя там был Win10 SDK; скопировал, а не «установил», моя вина).

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