CMake无法找到Visual C++编译器

141
安装了Visual Studio 2015并在之前的项目上运行CMake后,CMake报错无法找到C编译器。
The C compiler identification is unknown
The CXX compiler identification is unknown
CMake Error at CMakeLists.txt:4 (PROJECT):
  No CMAKE_C_COMPILER could be found.

CMake Error at CMakeLists.txt:4 (PROJECT):
  No CMAKE_CXX_COMPILER could be found.

我在Visual Studio文件夹中查找cl.exe,即C:\Program Files\Microsoft Visual Studio 14.0,但未能找到。

如何在Windows上使用Visual Studio 2015设置CMake工具?


1
也许2015的安装路径不是CMake所期望的?您使用的CMake版本是哪个?此外,我不清楚Windows版本的CMake,但可能CMake会在PATH中查找所需的程序,因此如果未更新,则无法找到编译器。 - Some programmer dude
1
我正在使用 cmake 3.2.3 版本,它声称支持 Visual Studio 2015。 - Asher
1
使用版本3.2.x,在安装VS2015之前,我遇到了安装Cmake时的问题,因此重新安装Cmake解决了我的问题。 - Andiana
有时候你可能会忘记重启电脑,或者在安装或更新Visual Studio后不想重启。这种情况下,CMake就无法找到你的编译器。 - Noki
在 VS 2022 中遇到了这个问题。找到了这个解决方案。更改注册表 HKLM\Software\Microsoft\Windows Kits\Installed Roots@KitsRoot10 解决了它。 - Henry Fung
31个回答

132

我已经找到了解决方案。虽然Visual Studio IDE安装成功,但它没有安装任何构建工具,因此也没有安装C++编译器。

通过尝试在Visual Studio 2015 GUI中手动创建一个C++项目,我成功提示它下载C++包。之后,CMake无难度地找到了编译器。


2
很棒,这个答案给了我提示。我使用我的VS2015 ISO安装了C++组件,问题解决了。 - Peter Liang
我也使用了VS2015 ISO进行安装,但它只安装了基本的VB/C#部分。不得不再次启动ISO以修改并安装其他C++内容。 - Abhinav Gauniyal
2
你们到底安装了哪些包/组件/东西?我创建了一个Visual C++ / Win32Project,它安装了两个组件,在VS内运行正常,但cmake仍然像之前一样抱怨。谢谢。-S - ssimm
太棒了! - user2434741
2
这在 VS 2017 上也可以工作 - 真是个奇怪的事情!感谢你的提示,伙计! - Steve Horvath
显示剩余2条评论

36

下面是对我有效的解决方案:

  1. 以管理员身份打开Visual Studio命令提示工具。在Windows 10中,它可能被称为“开发人员命令提示符”。
  2. 导航到您拥有CMake可执行文件的位置。
  3. 运行Cmake.exe
  4. 像往常一样选择构建和源文件夹
  5. 选择适当的Visual Studio编译器,然后点击配置按钮

希望它能顺利运行,没有出现问题。


@Mavie 很高兴能够帮助到您。 - Fortune
3
我认为你不需要以管理员身份运行VS命令提示符。但是,运行VS命令提示符会将CMake需要查找的所有内容放在路径上。根据您安装CMake的方式(是否将其放在路径上),您还可以导航到构建目录并从那里运行“cmake ..”。无论如何,我已经点赞了,因为例如Git Bash终端不会自动将所有内容放在其路径上。这帮助了我! - hetepeperfan
1
这似乎更像是一种变通方法而不是解决方案,因为通常,IDE生成器不需要设置在dev命令提示符中找到的各种环境变量(只有在使用类似于makefile生成器或Ninja之类的工具时才需要)。 - Ryan Pavlik
2
更新:在Windows 10上,这被称为开发人员命令提示符 - Mattijs
2
非常奇怪的解释: 1:它不叫VS Studio命令提示符 2:你是指使用“cd”命令导航吗? 3:你是说运行cmake-gui吗?就像你在第5步中所说的“点击”按钮一样? 4:继续?你是指填写吗? 5:在配置窗口的下拉框中,我可以选择VS编译器,但仍然无法识别C和C++编译器... - jaques-sam
1
顺便说一句,只需在搜索框中输入cmake,你就会找到cmake-gui。 - jaques-sam

32
我查看了CMakeError.log文件,发现一个关于无法运行'rc.exe'的错误。
我搜索并找到这个答案,将Microsoft SDK的bin目录中的RC.Exe和RcDll.Dll复制到VC的bin目录中,然后CMake就能正常工作了。
编辑:另一个问题的排名第一的答案建议这是一个路径问题,因此确保Microsoft SDK bin在您的PATH中就足够了。

是的,在CMakeError.log中阅读真实错误信息是有帮助的。在我的情况下,错误信息是LINK : fatal error LNK1104: cannot open file 'ucrtd.lib',可以通过https://dev59.com/LlMI5IYBdhLWcg3weLVS#71418520进行修复。 - Felix F Xu

17

对于在Visual Studio 2017上遇到问题的人:与相关编译器工具集一起需要选择和安装与CMake相关的功能。请参见下面的屏幕截图。

必须安装用于 CMake 的 Visual C++ 工具


2015版本怎么办?我在2015安装中找不到这个复选框。一个解决方案可能是升级到2017... - jaques-sam
1
@DrumM,这是针对Visual Studio 2017的。我不认为在VS 2015中存在此功能。 - Vadim Berman
你确定这是必要的吗?它不仅仅是为了在Visual Studio中使用CMake吗? - Peter Mortensen
@PeterMortensen:这对我解决了问题。再次感谢Visual Studio 2017。 - Vadim Berman
您不必安装Visual Studio的cmake。还有其他选项,例如直接从网站下载并通过chocolatey或其他系统包管理器进行安装。 - starball
不适用于我的MSVC2019。 - IceFire

16

确保您在生成器中使用的是正确的Visual Studio版本。 我曾错误地选择了Visual Studio 15,而实际安装的是Visual Studio 14。


3
这也是我的问题。这很令人困惑,因为Visual Studios 2015实际上是14版本! - Paul Wintz
4
请注意,如果您需要更改VS的版本,可能需要清除缓存。为此,请单击“文件>删除缓存”。 - Paul Wintz
1
这帮助了...最佳版本控制! - Noel Widmer
arrrrg,@PaulWintz 谢谢你的提醒。我想在我的情况下,我使用了一个干净的cmake缓存运行了cmake,但是当VisualStudio等待我重新启动计算机以完成VS更新时,cmake巧妙地缓存了不良情况。 - orion elenzil

10
如果以上解决方案都不起作用,那么请停下来进行一次检查。
我曾经因为使用了错误的-G <config>字符串而遭受了损失,并且它给我带来了这个误导性的错误。
首先,请从VS命令提示符中运行,而不是常规命令提示符。您可以在以下位置找到它:开始菜单 -> Visual Studio 2015 -> MSBuild Command Prompt for VS2015。这将设置所有正确的路径到VS工具等。
现在看看cmake有哪些生成器... cmake -help
...<snip>...
The following generators are available on this platform:
  Visual Studio 15 [arch]      = Generates Visual Studio 15 project files.
                                 Optional [arch] can be "Win64" or "ARM".
  Visual Studio 14 2015 [arch] = Generates Visual Studio 2015 project files.
                                 Optional [arch] can be "Win64" or "ARM".
  Visual Studio 12 2013 [arch] = Generates Visual Studio 2013 project files.
                                 Optional [arch] can be "Win64" or "ARM".
  Visual Studio 11 2012 [arch] = Generates Visual Studio 2012 project files.
                                 Optional [arch] can be "Win64" or "ARM".
  Visual Studio 10 2010 [arch] = Generates Visual Studio 2010 project files.
                                 Optional [arch] can be "Win64" or "IA64".
...

然后选择适当的字符串并添加 [arch]。
mkdir _build
cd _build
cmake .. -G "Visual Studio 15 Win64"

在子目录中运行cmake可以更轻松地执行“clean”操作,因为您只需删除该目录中的所有内容。
我升级到了Visual Studio 15,但没有注意到正在尝试为2012生成。

8
对于我来说,我查看了 CMakeError.log 文件并发现:

[...] error MSB8036:未找到 Windows SDK 版本 8.1。安装所需版本的 Windows SDK 或通过右键单击解决方案选择“重新定位解决方案”来更改项目属性页面中的 SDK 版本。

尽管我在 Windows 7 上使用 Visual Studio 2017,仍出现此错误。因此,似乎 CMake 正试图使用 Windows 8.1 SDK 构建其检测项目。
我使用 Visual Studio 安装程序添加了该组件,现在 CMake 的问题得到了解决。

5

菜单 → Visual Studio 2015 → Visual Studio 2015 MSBuild 命令提示符。然后 CMake 可以找到 cl.exe

set PATH="c:\Program Files (x86)\Windows Kits\10\bin\10.0.16299.0\x64\";%PATH%

将上面的路径更改为您的Windows SDK安装位置。

CMake可以找到rc.exe

进入CMakeLists.txt的路径,然后执行:

md .build
cd .build
cmake .. -G "Visual Studio 14 2015 Win64" -DCMAKE_BUILD_TYPE=Release
cmake --build .

-G后面的参数应该由CMake获取。使用--help命令;您可能具有生成器,也可能没有。


当您安装了msvc 2015和2017,并尝试使用msvc 2015构建时,它将在运行vs2015命令提示符时自动检测到10.0 SDK。您可以通过修改“VS2015 x64本机工具命令提示符”来指定SDK版本,以强制添加8.1 sdk到命令行参数的末尾,如下所示:“%comspec% /k ""C:\Program Files (x86)\msdev2015\VC\vcvarsall.bat"" amd64 8.1" - kalmiya
我需要单独安装“Visual Studio 2015的MSBuild命令提示符”吗?我已经安装了msvc 2017,但是Visual Studio的命令提示符不在那里。 - meen

2

在使用Visual Studio 2015 Professional时,我在Windows 10下遇到了这个问题,而使用Visual Studio 2015 Express则可以正常工作!在Windows 7下,两个版本的Visual Studio都可以正常工作。

从Visual Studio 2015 Professional IDE创建的新项目可以成功编译,但是CMake会报告找不到编译器而失败:

The C compiler identification is unknown
The CXX compiler identification is unknown

我将CMake从3.4.1升级到3.11.4,现在问题已经解决了。


2

我遇到了同样的问题,并通过重新启动Visual Studio安装并勾选以下选项来解决它:

Windows和Web开发 / 通用Windows应用程序开发工具 / Windows 10 SDK

它包含大多数应用程序中使用的标准C++头文件,因此通常也需要安装它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接