如何让clangd在vscodium下支持使用MSVC编译器的Cmake工程
背景
由于下面的一些原因:
- 不想使用微软开发的C++插件(一是Vscodium内不提供,二是这东西确实不太好用,3.5分)
- 项目使用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 |
|
安装 ninja
clangd
对于Cmake的支持需要借助一个名叫compile_commands.json
的文件来进行,这个文件记录了编译整个工程需要执行的所有编译命令等信息。如果直接使用Cmake .. -G "Visual Studo 17 2022"
,Cmake则不会生成compile_commands.json
。这是因为官方文档上写着Camke仅支持在Ninja
和GUN Makefiles
规则下支持compile_commands.json
,至于为什么会这样我也不清楚,因此为了生成这个文件,我们只能借助ninja
这个小构建工具。
安装的步骤也不用多讲,这东西就一个可执行文件,将其放到任意目录,然后添加环境变量即可,输入ninja --version
:
1 |
|
安装相关插件
请注意,这里我们仅需要安装如下两个插件:
- clangd 提供clangd对vscode的支持
- Cmake 提供Cmake的基本高亮
- Cmake Tools(可选,这东西每次打开工程会自动执行cmake命令,我个人不喜欢)
新建工程
到这里我们就能新建工程了,下面给出基本的文件:
1 |
|
注意这里的第三行set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
一定要写,这是clangd能正常补全的关键所在.
1 |
|
好了,到目前为止我们就得到如下的工程:
1 |
|
这时候如果你装了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项目了.