cmake不断重新生成缓存[cmake + visual studio open folder + ninja + clang-cl]

时间:2017-12-09 07:45:38

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

当我编辑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"
        }
      ]
    }
  ]
}

1 个答案:

答案 0 :(得分:1)

将我的评论转化为答案

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

<强> 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确实记得它已经搜索过编译器
    • Et瞧,您收到有关已更改编译器的错误消息

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

<强>参考