Linux下使用VScode开发ROS时clangd插件的使用

本人在最近刚开始接触Linux和ROS开发,在开发过程中发现,微软的C/C++的intelliSense的代码补全,纠错等功能是真的难用,恰好有学长跟我提起了clangd这个东西,而且以前用clion去写一些小的C/C++工程,想着怎么去配置一下在vscode上使用clangd,让自己写代码更舒服一些(主要是太懒了),于是就有了这篇文章。

由于本人是初学者,懂的东西很少,折腾了一天只是能做到能用clangd的一些功能。可能文章中也有些错误和术语使用错误,敬请各位指出,能给我一个学习改进的机会。

1.首先安装Vscode就不多说了,也有很多博客去安装教学。

2.配置ROS

ROS的配置部分,由于我是跟随B站上的教程学习的,可以直接移步教程,链接如下 【Autolabor初级教程】ROS机器人入门

2.1 下载插件(已安装好VScode)

2.1.1 C/C++

此插件就是上文提到的微软的C/C++,我们虽然使用他的intelliSense的代码补全,纠错等功能,但是他是ROS插件的依赖项,是ROS插件必不可少的一项 

2.1.2 Chinese (Simplified) (简体中文) Language Pack for Visual Studio Code

此插件对于新手来说比较友好,是一个汉化插件,如果英语好可以不用QAQ 

2.1.3 CMake Tools

此插件不用多说,CMake 

2.1.4 Python

也是ROS插件的依赖项之一,必不可少,而且ROS是支持C++和Python开发的 

2.1.5 ROS

ROS插件本身(需要你提前已经安装好了ROS的任意版本,这个安装方式上方链接也有) 

2.1.6 注意:

此处只是配置ROS,所以先不安装插件clangd(冲突弹窗很烦人0.0)

3.安装llvm+clang

直接在GitHub上有Releases,可以直接下载编译好的包 llvm/llvm-project

在此处找到Releases

点进去之后,我下载的是

 注意: 可以点击下载,但是速度一言难尽啊,可以吧鼠标放在蓝字(就是上图箭头指向的蓝字)上右键获取下载网址,找到代理网站下载 代理网站网址奉上,点击蓝字进入,把刚才复制进来的网址输入进去下载即可 GitHub Proxy 

解压

下载后找到下载的目标目录(一般都是Downloads)

tar -xf clang+llvm-15.0.6-x86_64-linux-gnu-ubuntu-18.04.tar.xz
mkdir llvm
mv clang+llvm-15.0.6-x86_64-linux-gnu-ubuntu-18.04 llvm

或者直接将压缩包移动到llvm目录下再解压

设置环境变量

在主目录中按下Ctrl+H (显示隐藏文件)找到.bashrc右键编辑,在最后加上 export PATH="/home/wang/Downloads/llvm/clang+llvm-15.0.6-x86_64-linux-gnu-ubuntu-18.04/bin:$PATH"

保存关闭(双引号内就是刚才解压的文件夹中的bin目录所在路径,可以在bin目录下打开终端使用pwd获取路径)

打开终端,运行命令source .bashrc刷新环境变量

查看是否安装成功

打开终端,输入clang --version,有版本说明即安装成功

注意:上述文件名称,目录路径,均按照我的电脑而来,如果下载不同版本的llvm,在解压的时候记得改一下名称,并且设置环境变量的时候最好用pwd获取路径(因为我直接安装在了Downloads目录下了)

也可以直接apt下载,但是他是安装的10版本的,但是一些重要功能都是在10版本之后出的,所以就不做过多的赘述了

4.配置VScode使用clangd

关于如何去在VScode中使用clangd开发ROS,需要达成以下几点: 1.解决微软的C/C++的intelliSense与clangd的冲突 2.配置编译指令使生成compile_commands.json文件

4.1 安装插件clangd

4.2 解决微软的C/C++的intelliSense与clangd的冲突

由于微软的C/C++的intelliSense与clangd的作用都是代码补全、纠错等功能,所以在使用时是有冲突的,但是我们又不能卸载插件C/C++,因为他是ROS插件的依赖项,所以需要解决冲突 实际上,安装完clangd插件之后,VScode左下角会弹窗描述该问题  这时,我们只需点击Disable IntelliSense即可

4.3 配置编译指令使生成compile_commands.json文件

4.3.1 compile_commands.json

compile_commands.json文件是使用clangd的一个重要文件。 VScode的官网插件clangd的官方文档中有描述:

要理解源代码,clangd需要知道构建标志。

默认情况下,clangd将假设您的代码构建为clang-some_file.cc,您可能会收到关于缺少#included文件等错误。

compile_commands.json(编译命令.json)#

此文件为项目中的每个源文件提供编译命令。它通常由工具生成。

clangd将查找您编辑的文件的父目录,以及名为build/的子目录。例如,如果编辑$SRC/gui/window.cpp,我们将在$SRC/gi/、$SRC/guid/build/、$SRC/、$SSRC/build/…

所以想要clangd能够在开发过程中能够找到#include文件,和正常使用代码补全等功能,我们需要生成compile_commands.json文件

4.3.2 修改cmake指令以生成compile_commands.json文件

在官方文档中,这样描述了使用CMake构建的项目的compile_commands.json文件生成方式: cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=1 但是ROS中使用的不是CMake,而是将cmake与make的编译方式做了一个封装的指令工具catkin_make

所以我们在编译的时候使用指令catkin_make -DCMAKE_EXPORT_COMPILE_COMMANDS=1即可 如果我们使用的是在上述ROS教程中的配置tasks.json去用快捷键Ctrl+Shift+B去编译源代码,则需要将tasks.json改成以下形式

{
	// 有关 tasks.json 格式的文档,请参见
		// https://go.microsoft.com/fwlink/?LinkId=733558
		"version": "2.0.0",
		"tasks": [
			{
				"label": "catkin_make:debug", //代表提示的描述性信息
				"type": "shell",  //可以选择shell或者process,如果是shell代码是在shell里面运行一个命令,如果是process代表作为一个进程来运行
				"command": "catkin_make",//这个是我们需要运行的命令
				"args": ["-DCMAKE_EXPORT_COMPILE_COMMANDS=1"],//如果需要在命令后面加一些后缀,可以写在这里,比如-DCATKIN_WHITELIST_PACKAGES=“pac1;pac2”
				"group": {"kind":"build","isDefault":true},
				"presentation": {
					"reveal": "always"//可选always或者silence,代表是否输出信息
				},
				"problemMatcher": "$msCompile"
			}
		]
	}
4.3.2.1 如何生成tasks.json文件

如果没有tasks.json文件,使用快捷键Ctrl+Shift+B调用编译后选择catkin_make:build一项点击后方小齿轮即可。

5.使用clangd

1.当我们按照上述方法配置好之后,在一个新的工作空间编写程序时仍然会出现#include 报错的情况,那是因为我们还未编译文件,需要创建一个cpp文件,修改CMakeLists.txt文件后编译一下生成compile_commands.json文件

注意:由于compile_commands.json文件的生成需要检测到实际的编译过程,所以当出现#include报错的情况,可以尝试编译一下

2.但是此时打开以前的工程,即未配置clangd之前就已经写完的工程,仍会出现#include报错的情况,那是因为检测不到实际的编译过程,可以再终端中先使用命令catkin_make clean后再进行编译