本人在最近刚开始接触Linux和ROS开发,在开发过程中发现,微软的C/C++的intelliSense的代码补全,纠错等功能是真的难用,恰好有学长跟我提起了clangd这个东西,而且以前用clion去写一些小的C/C++工程,想着怎么去配置一下在vscode上使用clangd,让自己写代码更舒服一些(主要是太懒了),于是就有了这篇文章。
由于本人是初学者,懂的东西很少,折腾了一天只是能做到能用clangd的一些功能。可能文章中也有些错误和术语使用错误,敬请各位指出,能给我一个学习改进的机会。
ROS的配置部分,由于我是跟随B站上的教程学习的,可以直接移步教程,链接如下
【Autolabor初级教程】ROS机器人入门
此插件就是上文提到的微软的C/C++,我们虽然使用他的intelliSense的代码补全,纠错等功能,但是他是ROS插件的依赖项,是ROS插件必不可少的一项
此插件对于新手来说比较友好,是一个汉化插件,如果英语好可以不用QAQ
也是ROS插件的依赖项之一,必不可少,而且ROS是支持C++和Python开发的
ROS插件本身(需要你提前已经安装好了ROS的任意版本,这个安装方式上方链接也有)
此处只是配置ROS,所以先不安装插件clangd(冲突弹窗很烦人0.0)
直接在GitHub上有Releases,可以直接下载编译好的包
llvm/llvm-project
注意:
可以点击下载,但是速度一言难尽啊,可以吧鼠标放在蓝字(就是上图箭头指向的蓝字)上右键获取下载网址,找到代理网站下载
代理网站网址奉上,点击蓝字进入,把刚才复制进来的网址输入进去下载即可
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
,有版本说明即安装成功
2023年6月20日补:
如果安装完毕输入clang --version
,出现报错clang: error while loading shared libraries: libtinfo.so.5: cannot open shared object file: No such file or directory
,解决方式:sudo apt-get install libtinfo5
也可以直接apt下载,但是他是安装的10版本的,但是一些重要功能都是在10版本之后出的,所以就不做过多的赘述了
关于如何去在VScode中使用clangd开发ROS,需要达成以下几点:
1.解决微软的C/C++的intelliSense与clangd的冲突
2.配置编译指令使生成compile_commands.json
文件
由于微软的C/C++的intelliSense与clangd的作用都是代码补全、纠错等功能,所以在使用时是有冲突的,但是我们又不能卸载插件C/C++,因为他是ROS插件的依赖项,所以需要解决冲突
实际上,安装完clangd插件之后,VScode左下角会弹窗描述该问题
这时,我们只需点击Disable IntelliSense
即可
compile_commands.json
文件compile_commands.json
文件是使用clangd的一个重要文件。
在VScode的官网插件clangd的官方文档中有描述:
要理解源代码,clangd需要知道构建标志。
默认情况下,clangd将假设您的代码构建为clang-some_file.cc,您可能会收到关于缺少#included文件等错误。
compile_commands.json(编译命令.json)#
此文件为项目中的每个源文件提供编译命令。它通常由工具生成。
clangd将查找您编辑的文件的父目录,以及名为build/的子目录。例如,如果编辑 S R C / g u i / w i n d o w . c p p ,我们将在 SRC/gui/window.cpp,我们将在 SRC/gui/window.cpp,我们将在SRC/gi/、 S R C / g u i d / b u i l d / 、 SRC/guid/build/、 SRC/guid/build/、SRC/、$SSRC/build/…
所以想要clangd能够在开发过程中能够找到#include文件,和正常使用代码补全等功能,我们需要生成compile_commands.json
文件
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"
}
]
}
如果没有tasks.json文件,使用快捷键Ctrl
+Shift
+B
调用编译后选择catkin_make:build
一项点击后方小齿轮即可。
1.当我们按照上述方法配置好之后,在一个新的工作空间编写程序时仍然会出现#include 报错的情况,那是因为我们还未编译文件,需要创建一个cpp文件,修改CMakeLists.txt文件后编译一下生成compile_commands.json
文件
注意:由于compile_commands.json
文件的生成需要检测到实际的编译过程,所以当出现#include报错的情况,可以尝试编译一下
2.但是此时打开以前的工程,即未配置clangd之前就已经写完的工程,仍会出现#include报错的情况,那是因为检测不到实际的编译过程,可以再终端中先使用命令catkin_make clean
后再进行编译