当我编辑 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"
}
]
}
]
}
最佳答案
将我的评论变成答案
使用 ninja 时,您必须为编译器提供完整路径与 visual-studio-2017 :
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/