我一直在寻找,这个问题似乎以各种形式出现了很多。它通常是由缺少的编译器引起的,可以说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发现它们并生成项目(这里有意使用真实路径,因为我怀疑路径本身可能是导致此错误的原因,请注意外来字符):< / p>
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
文件的顶部。
问题仍然存在,当可以确定正确的生成器时,为什么不能自动确定这些路径。
根据常见问题解答,它是not recommended to set compiler paths in CmakeLists.txt,因此另一种方法可以是:
cmake
-D CMAKE_C_COMPILER="path/to/compiler"
-D CMAKE_CXX_COMPILER="path/to/compiler"
..
答案 0 :(得分:1)
之前有报道称由于unicode路径(here,here)而导致CMake的Visual Studio生成器中断,虽然这个问题似乎很长(CMake commit),但它可能表明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路径。