我一直在搜索,这个问题似乎以各种形式出现了很多。它通常是由缺少编译器引起的,该编译器会说 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_ID
、CMAKE_CXX_COMPILER_VERSION
和CMAKE_CXX_COMPILER_ID_TOOL
。在您的情况下,似乎设置了CMAKE_CXX_COMPILER_ID
和CMAKE_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 路径中表现不佳。