CMake 识别 MSVC(C 和 CXX),但仍抛出"未找到 CMAKE_*_COMPILER"

CMake identifies MSVC (both C and CXX), but still throws 'No CMAKE_*_COMPILER found'

本文关键字:CMAKE COMPILER MSVC 识别 CXX CMake      更新时间:2023-10-16

我一直在搜索,这个问题似乎以各种形式出现了很多。它通常是由缺少编译器引起的,该编译器会说 C 和 CXX 编译器unknown

然而,就我而言,这不是正在发生的事情。我的机器上有 C 和 C++ 编译器,例如通过 Visual Studio,一切都可以很好地编译。但是,通过cmake,会发生这种情况:

> cmake .

输出:

-- Building for: Visual Studio 14 2015
-- The C compiler identification is MSVC 19.0.24215.1
-- The CXX compiler identification is MSVC 19.0.24215.1
CMake Error at CMakeLists.txt:12 (project):
No CMAKE_C_COMPILER could be found.
CMake Error at CMakeLists.txt:12 (project):
No CMAKE_CXX_COMPILER could be found.
-- Configuring incomplete, errors occurred!

我有点困惑。它怎么能找到编译器,然后忘记它?输出日志中也没有错误(或者如果有,我不认识它们)。

这些是CMakeOutput.log的最后一行:

Compilation of the CXX compiler identification source "CMakeCXXCompilerId.cpp" produced "CompilerIdCXX.exe"
Compilation of the CXX compiler identification source "CMakeCXXCompilerId.cpp" produced "CompilerIdCXX.vcxproj"
The CXX compiler identification is MSVC, found in "[...]/CMakeFiles/3.9.1/CompilerIdCXX/CompilerIdCXX.exe"

CMakeLists.txt是现有工作项目的一部分,因此我被引导相信这是一个本地配置问题。


更新

手动指定这些编译器如下将使cmake发现它们并生成项目(此处故意使用真实路径,因为我怀疑路径本身可能是此错误的原因,请注意外语字符):

SET(CMAKE_C_COMPILER "D:/Programfájlok (x86)/Microsoft Visual Studio 14.0/VC/bin")
SET(CMAKE_CXX_COMPILER "D:/Programfájlok (x86)/Microsoft Visual Studio 14.0/VC/bin")

注意:这些位于CmakeLists.txt文件的顶部。

问题仍然存在,为什么 cmake 不能自动确定这些路径,当它可以确定正确的生成器时。

更新 2

根据FAQ,不建议在CmakeLists.txt中设置编译器路径,因此另一种方法可以如下:

cmake
-D CMAKE_C_COMPILER="path/to/compiler"
-D CMAKE_CXX_COMPILER="path/to/compiler"
..

之前有关于CMake的Visual Studio生成器由于Unicode路径(这里,这里)而中断的报告,虽然这个问题似乎已经修复了很长时间(CMake提交),但它可能表明Unicode路径在某些情况下可能仍然会造成麻烦。

根据您的描述,这听起来不像是安装问题 - 一个新的Visual Studio安装,否则可以正常工作。由于手动指定CMAKE_CXX_COMPILER时,构建正在工作,我最好的猜测是可能与CMake的编译器检测有关,涉及Unicode路径。

以上只是一个有根据的猜测。但是,如果它是您自己的项目,和/或您可以控制 CMake 的调用方式,则使用-DCMAKE_C_COMPILER-DCMAKE_CXX_COMPILER指定 CMake 的编译器是完全可以的。

怎么能找到编译器,然后忘记它?

负责确定编译器版本的宏称为CMAKE_DETERMINE_COMPILER_ID(在CMakeDetermineCompilerId.cmake中)。通过宏代码,在正常操作期间应该设置几个定义,即CMAKE_CXX_COMPILER_IDCMAKE_CXX_COMPILER_VERSIONCMAKE_CXX_COMPILER_ID_TOOL。在您的情况下,似乎设置了CMAKE_CXX_COMPILER_IDCMAKE_CXX_COMPILER_VERSION,但由于某种原因CMAKE_CXX_COMPILER_ID_TOOL没有:

# Display the final identification result.
if(CMAKE_${lang}_COMPILER_ID)
if(CMAKE_${lang}_COMPILER_VERSION)
set(_version " ${CMAKE_${lang}_COMPILER_VERSION}")
else()
set(_version "")
endif()
message(STATUS "The ${lang} compiler identification is "
"${CMAKE_${lang}_COMPILER_ID}${_version}")
else()
message(STATUS "The ${lang} compiler identification is unknown")
endif()
# Check if compiler id detection gave us the compiler tool.
if(CMAKE_${lang}_COMPILER_ID_TOOL)
set(CMAKE_${lang}_COMPILER "${CMAKE_${lang}_COMPILER_ID_TOOL}" PARENT_SCOPE)
elseif(NOT CMAKE_${lang}_COMPILER)
set(CMAKE_${lang}_COMPILER "CMAKE_${lang}_COMPILER-NOTFOUND" PARENT_SCOPE)
endif()

CMAKE_CXX_COMPILER_ID_TOOL由同一文件中的CMAKE_DETERMINE_COMPILER_ID_BUILD宏设置。设置CMAKE_CXX_COMPILER_ID_TOOL(运行进程、捕获其输出、正则表达式匹配等)涉及相当多的代码,因此理论上可能其中一些代码(甚至是调用的 Visual Studio 命令)在 Unicode 路径中表现不佳。