CMake识别MSVC(包括C和CXX),但仍然会发现没有发现CMAKE _ * _编译器'

时间:2017-08-28 21:21:40

标签: c++ cmake

我一直在寻找,这个问题似乎以各种形式出现了很多。它通常是由缺少的编译器引起的,可以说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文件的顶部。

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

更新2

根据常见问题解答,它是not recommended to set compiler paths in CmakeLists.txt,因此另一种方法可以是:

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

1 个答案:

答案 0 :(得分:1)

之前有报道称由于unicode路径(herehere)而导致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_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路径。