【问题标题】:cmake keeps regenerating cache [cmake + visual studio open folder + ninja + clang-cl]cmake 不断重新生成缓存 [cmake + visual studio 打开文件夹 + ninja + clang-cl]
【发布时间】:2017-12-09 07:45:38
【问题描述】:

当我编辑 CMakeLists.txt 文件时,第一次它工作并使用缓存,但第二次我总是得到

1> 现有缓存包含对不存在的 MSVC 编译器的引用。 删除缓存并重新生成。

只有在我使用 clang 编译器时才会发生这种情况。如果我使用默认的 msvc 编译器,则始终使用缓存

// main.cpp

int main()
{
    return 0;
}

#CMakeLists.txt
cmake_minimum_required(VERSION 3.0)
add_executable(app main.cpp)

//CMakeSettings.json
{
  // See https://go.microsoft.com//fwlink//?linkid=834763 for more information about this file.
  "configurations": [
    {
      "name": "x86-Debug",
      "generator": "Ninja",
      "configurationType": "Debug",
      "inheritEnvironments": [ "msvc_x86" ],
      "buildRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\build\\${name}",
      "installRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\install\\${name}",
      "cmakeCommandArgs": "",
      "buildCommandArgs": "-v",
      "ctestCommandArgs": "",
      "variables": [
        {
          "name": "CMAKE_CXX_COMPILER",
          "value": "clang-cl"
        },
        {
          "name": "CMAKE_C_COMPILER",
          "value": "clang-cl"
        },
        {
          "name": "CMAKE_SYSTEM_NAME",
          "value": "Windows"
        }
      ]
    }
  ]
}

【问题讨论】:

  • 你安装了哪些版本的CLang?属于 Visual Studio 2017 的包? clang --version 输出什么?
  • @Florian clang version 5.0.0 (tags/RELEASE_500/final) 目标:x86_64-pc-windows-msvc

标签: c++ visual-c++ cmake


【解决方案1】:

把我的 cmets 变成答案

当您使用 时,您必须为编译器提供完整路径:

CMakeSettings.json

...
"variables": [
     {
         "name": "CMAKE_CXX_COMPILER",
         "value": "C:\\Program Files\\LLVM\\bin\\clang-cl.exe"
     },
     {
         "name": "CMAKE_C_COMPILER",
         "value": "C:\\Program Files\\LLVM\\bin\\clang-cl.exe"
     },
     {
         "name": "CMAKE_SYSTEM_NAME",
         "value": "Windows"
     }
]
...

这是我认为正在发生的事情:

  • CMake 总是将编译器路径转换为绝对路径(您的第一次调用)
  • 在第二次调用中,VS2017 再次将 CMAKE_CXX_COMPILER 变量覆盖到 CMake
    • 这不是有意的,因为它会再次覆盖/强制值,但 CMake 确实记得它已经搜索过编译器
    • 瞧,您会收到一条关于编译器更改的错误消息

我认为这是 VS2017 使用 CMake 的一个错误。

参考文献

【讨论】:

  • @James 稍后必须查看视频。只是为了澄清一下:您是否在PATH 中安装/可见 CLang?您可以尝试在编译器设置中使用编译器的完整路径吗?你能检查一下你在CMakeCache.txt 中的CMAKE_CXX_COMPILER 有什么吗?
  • 使用全路径已解决问题,非常感谢!!!!!!。我的 PATH 中可以看到 Clang,我认为这是正确的做法。作为记录,CMake 正在检测到 clang-cl 的正确路径。正如我所说,这是全新的 Windows 10 安装,我只安装了 Visual Studio 2017 15.5 + LLVM 5.0。
  • 请编辑您关于使用完整路径的答案,以便我接受。
  • @James 不客气。而且,确定我稍后会更新我的答案。问题是我现在明白发生了什么,我认为这是 VS2017 使用 CMake 中的一个错误。我仍然要做一些测试,但这是我认为正在发生的事情:CMake 总是将编译器路径转换为绝对路径(你的第一次调用)。在第二次调用中,VS2017 再次使用-D 对 CMake 的命令行调用(这不是有意的,因为它会再次覆盖/强制值)并且 CMake 确实记得它已经搜索过编译器。瞧,您会收到一条有关更改的编译器的错误消息。
猜你喜欢
  • 2019-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-12
  • 2016-09-19
相关资源
最近更新 更多