c++ - cmake 不断重新生成缓存 [cmake + visual studio 打开文件夹 + ninja + clang-cl]

标签 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"
        }
      ]
    }
  ]
}

最佳答案

将我的评论变成答案

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

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 voila,您收到有关更改编译器的错误消息

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

引用资料

关于c++ - cmake 不断重新生成缓存 [cmake + visual studio 打开文件夹 + ninja + clang-cl],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47726480/

相关文章:

.net - 在 C++/CLI 中动态加载 EXE 程序集时发生异常(无法加载文件或程序集',版本 = 1.0.3836.39802 ...)

c++ - 带参数的 MSVC 2010 项目范围的宏

c++ - Windows 上的 CMake zlib 依赖错误

directx - 如何使用 cmake 编译 .fx 文件

c++ - 如何在 Windows R 中显示 C++ 输出消息

visual-c++ - 如何让 VC 编译器更好地优化我的 SIMD 代码?

c++ - 将一个类放在单独的文件中不起作用[C++]

c++ - 将 Makefile 转换为 CMakeLists.txt

c++ - 为什么我们不能有非常量类级别的静态变量?

c++ - MPI,通过其中一个过程产生一个 child