如何让clangd在vscodium下支持使用MSVC编译器的Cmake工程

背景

由于下面的一些原因:

  1. 不想使用微软开发的C++插件(一是Vscodium内不提供,二是这东西确实不太好用,3.5分)
  2. 项目使用Cmake + MSVC构建(Gcc或者说Mingw的ABI和项目不兼容)

我就产生了标题的想法,也就是说如何让clangd在vscodium下支持使用MSVC编译器的Cmake工程,或者表述为一个比较常见的场景:如何抛弃微软的C++插件在vscode/vscodium上使用MSVC开发C++。

为了达到这一目的,我很快就找到了LLVM官方提供的C++ LSP: clangd。但是在windows下使用这个插件还是需要折腾下的的,一方面是好多人不会翻阅文档,另一方面是Cmake在某些方面比较拐弯抹角。

下面我从一个新安装的Vscodium(完全开源并重新打包的vscode)开始一步步描述怎么在windows下正常使用clangd.

教程

这里已经默认你已经安装好了CMake和MSVC.

安装 llvm

clangd的本体是llbm工程的一部分,使用这个东西自然要安装llvm,不要嫌弃llvm太大,虽然它的大部分功能我们大概用不到,但是里面的好多小工具还是挺好的,比如clang-tidy, clanng-format等等。

前往llvm的github主页下载安装器,双击安装,然后添加环境变量,这一步应该不用我多说,和普通的开发相关软件的安装方法一样,在这一步完成后打开终端输入相关命令检查安装是否正常:

1
2
3
4
5
6
7
8
9
10
11
12
PS C:\Users\xhy\blog> clang-format --version
clang-format version 14.0.0
PS C:\Users\xhy\blog> clang --version
clang version 14.0.0
Target: x86_64-pc-windows-msvc
Thread model: posix
InstalledDir: C:\Program Files\LLVM\bin
PS C:\Users\xhy\blog> clangd --version
clangd version 14.0.0
Features: windows
Platform: x86_64-pc-windows-msvc
PS C:\Users\xhy\blog>

安装 ninja

clangd对于Cmake的支持需要借助一个名叫compile_commands.json的文件来进行,这个文件记录了编译整个工程需要执行的所有编译命令等信息。如果直接使用Cmake .. -G "Visual Studo 17 2022",Cmake则不会生成compile_commands.json。这是因为官方文档上写着Camke仅支持在NinjaGUN Makefiles规则下支持compile_commands.json,至于为什么会这样我也不清楚,因此为了生成这个文件,我们只能借助ninja这个小构建工具。

安装的步骤也不用多讲,这东西就一个可执行文件,将其放到任意目录,然后添加环境变量即可,输入ninja --version:

1
2
PS C:\Users\xhy\Desktop\ninja> ninja --version
1.10.2

安装相关插件

请注意,这里我们仅需要安装如下两个插件:

  1. clangd 提供clangd对vscode的支持
  2. Cmake 提供Cmake的基本高亮
  3. Cmake Tools(可选,这东西每次打开工程会自动执行cmake命令,我个人不喜欢)

新建工程

到这里我们就能新建工程了,下面给出基本的文件:

1
2
3
4
5
//main.cpp
#include <iostream>
int main(int, char**) {
std::cout << "Hello, world!\n";
}

注意这里的第三行set(CMAKE_EXPORT_COMPILE_COMMANDS ON)一定要写,这是clangd能正常补全的关键所在.

1
2
3
4
cmake_minimum_required(VERSION 3.0.0)
project(demo VERSION 0.1.0)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
add_executable(demo main.cpp)

好了,到目前为止我们就得到如下的工程:

1
2
3
.
├── CMakeLists.txt
└── main.cpp

这时候如果你装了cmake tools就不要用vscodium打开当前工程,因为它会自动根据默认规则执行cmake并生成相关cmake缓存,而不是用我们指定的规则.如果你已经打开了就请删除自动生成的Build目录.

执行Cmake

这一步要单独拿出来说是因为有一些小细节需要注意.我们在windows下使用Cmake .. -G Ninja规则执行cmake时cmake会自动使用mingw编译器,而不是msvc,这里应该可以用命令强制使用msvc,但是我不会整,因此我的做法是打开Developer Command Prompt for VS 2022从这里进入我们项目的主目录,这时候因这个终端有环境变量,我们再新建build目录,然后执行Cmake .. -G Ninja,就能生成以msvc为后端的ninja + cmake工程了.

打开编辑器

到这一步,我们终于能打开编辑器了,你会发现clabgd能正常补全MSVC编译器下的cmake项目了.