!20 添加clangd配置说明,目录中亦添加此项

Merge pull request !20 from muruichao/master
This commit is contained in:
muruichao 2024-10-17 01:39:18 +00:00 committed by Gitee
commit a84b20697b
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
2 changed files with 93 additions and 0 deletions

View File

@ -0,0 +1,90 @@
# 任意C/C++工程如何使跳转等编辑功能正常工作clangd
- 简单来说
* 能构建编译数据库就构建编译数据库
* 不能构建编译数据库时,在插件设置中添加头文件搜索路径能解决大部分问题
* 对clangd配置有了解后可以使用clangd配置做更定制化的设置
## clangd
- 着色(高亮)、跳转、语法检查、查找引用、补全等编辑功能是如何实现的?
* 最关键的是需要解析代码,生成抽象语法树,要跨文件解析代还要知晓代码如何构建,整个处理过程类似编译器的处理过程。称提供这种服务的程序叫语言服务器
* LSPLanguage Server Protocol语言服务器协议用于编辑器和语言服务器之间的通信是微软在2016年推出的协议。采用LSP编辑器可以不开发自己的编辑功能复用其他语言服务器的功能。在LSP结构中主要由客户端和服务端组成客户端在编辑器中服务端是语言服务器
* 具体到C/C++clangd是一个开源的C/C++语言服务器它基于Clang C++编译器Clang是LLVM的一部分
* Kylin-IDE和Kylin-Code推荐的C/C++编辑支持插件Kylin Clangd正是基于clangd。所以为了更好地使用使用C/C++编辑功能需要了解一些clangd的配置方法
* 安装操作系统软件源中通常提供了clangd
- 安装命令`apt install clangd`或`yum install clang-tools-extra`
- 软件源中有时会有多个版本的clangd尽量安装最新版本的clangd桌面系统可以使用`apt search clangd`查询clangd版本通常为软件包名为`clangd-n`n表示版本
- 如果使用Kylin-IDE或Kylin-Code的开发环境快速部署功能安装C/C++开发选项则会自动安装clangd而不需要手动安装
- 已安装后,版本查看命令:`clangd --version`
## 编译数据库
- clangd正常解析代码需要编译数据库
- 需要先理解编译数据库这个概念
* 一个常见的情况打开一个C/C++ 源代码文件之后,为什么编辑器中报了很多警告和错误,而代码明明没有任何问题
- 解析源代码需要一定的上下文,为了让 clangd 能够正确解析项目中的 C/C++ 文件使其自动补全跳转等特性生效clangd 需要知道如何编译源代码文件
- 即 clangd 需要知道代码文件的编译命令
* 通常clangd 从**编译数据库**中获取基本的编译命令。也就是说,如果存在编译数据库,并且编译数据库和代码对应,则编辑功能就可以正常使用。如果没有编译数据库或其他配置,则代码通常不能正常解析
- 编译数据库是一个文本文件,它描述了代码库的编译命令。它通常是:
* 一个名为 `compile_commands.json` 的文件,列出了项目中每个文件的编译命令。该文件通常由像 CMake 这样的构建系统生成
* 一个名为 `compile_flags.txt` 的文件,如果所有代码文件使用的编译参数相同,可以把使用的编译参数一个一行放在此配置文件中。针对简单的项目,可以采用该方式。如果`compile_commands.json`存在则`compile_flags.txt` 文件将被忽略
* clangd首先在包含源文件的目录中和此目录下的build目录下检查编译数据库然后向上遍历父目录
- 编译数据库的生成方法
* 方法一:构建工具生成。如果工程是使用构建工具构建的,则构建工具可以生成编译数据库
- CMake: 使用 `-DCMAKE_EXPORT_COMPILE_COMMANDS=ON` 选项生成 `compile_commands.json` 文件, 但是该选项仅在 Generator 是 Makefile 或者 Ninja 的时候有效果。
- Bazel: 使用 `--experimental_action_listener=//tools/clang:generate_compile_commands` 选项生成 `compile_commands.json` 文件。
* 方法二bear工具
- 原理bear工具跟踪编译过程记录编译命令将编译命令记录到`compile_commands.json` 文件中
- 使用:需要在构建命令前面加上 `bear` ,命令格式如下
```bash
bear -- <your-build-command>
例子:
make clean//需要重新构建才能执行所有构建命令
bear -- make
```
- 缺点bear需要全程跟踪编译过程需要编译一遍才能够生成编译数据库对于某些编译时间很长的大型项目耗时较多
- 安装方法:操作系统软件源中通常提供了 bear 工具,可以直接安装。例如,桌面操作系统:
```bash
sudo apt-get install bear
```
## 无法生成编译数据库怎么办?
### 使用Kylin Clangd插件设置clangd
- 设置入口首先要安装Kylin Clangd插件然后点击左下角齿轮图标选择“设置”在搜索框中输入clangd即可显示clangd配置
* 设置有两类,一类是“用户”,另一类是“工作区”
- 用户:是当前操作系统用户的配置,对用户的所有项目生效;如果想对所有项目生效,则修改用户配置
- 工作区:是当前工程的配置,仅对当前工程生效;如果仅想在当前工程使用当前设置,则修改工作区配置
- 若工作区配置和用户配置有冲突,如果工作区配置中的某个条目后标记了“修改于用户”,表示以用户配置为准;若无此标记,则以工作区配置为准
- 插件主要配置参数含义
* Arguments为clangd server添加参数。具体参数可以执行命令查看`clangd -h`
* Head Insertion控制clangd是否自动插入#include
- iwyu在编写代码时会根据当前代码符号自动插入头文件即便头文件通过其他头文件包含了。有时自动插入头文件会引起困惑如不需此功能请选择never
- never不自动插入头文件
* On Config Changed当编译数据库或配置文件变化时如何处理。例如当`compile_commands.json`被修改后修改了代码文件编译方法或添加了新代码文件。当clangd版本是12或以上时clangd会自动重载可以忽略此参数不过目前银河麒麟操作系统上的clangd版本通常是10或11故此参数仍有效
- restart自动重启clangd server以使修改生效
- prompt提示用户是否重启用户确认重启后再重启
- ignore不重启
* Pathclangd路径。如果clangd安装在了非标准路径可以使用此参数定义clangd程序路径
* Trace指定一个文件路径clangd会将自己运行时的性能数据写入到这个文件中便于分析clangd的性能
* **Additional Include Paths**:额外的头文件包含检查路径。此参数用途较大,编辑功能不能正常生效,多数情况是头文件未找到,可以设置此参数。类似添加了编译参数-I但仅用于代码解析不用于代码实际编译
- 设置方法:直接填入包含路径即可,例如`/home/user/work/code/include`,该值是一个数组,可以设置多个包含路径
* Fallback FlagsFallbanck编译参数是指在没有找到编译数据库时clangd会使用的默认解析方法。Fallback编译参数为clangd提供了一种灵活的方式以便在缺少特定编译信息时仍能进行代码分析和补全。在快速开发或小型项目中可能不需要复杂的构建系统Fallback编译参数可以提供基本的支持
- 添加格式:直接添加参数即可,例如:
```
-std=c++17
-I/usr/local/include
```
### 使用clangd配置clangd 11 以上)
- clangd11及以上可以使用clangd配置配置文件是yaml格式文件
* 仅对某工程生效:.clangd文件放在工程代码目录中clangd会搜索活动代码文件的所在目录和上层目录
- 注意区分:.clangd目录是clangd11之前的版本使用的一个暂存目录
* 用户设置:~/.config/clangd/config.yaml
- 配置方法参考https://clangd.llvm.org/config
- 简单例子
```yaml
CompileFlags:
Add: [-xc++, -Wall] # 增加编译参数列表
CompilationDatabase./out/ # 指定编译数据库目录
```
## 参考链接
- https://clangd.llvm.org/

View File

@ -25,6 +25,8 @@
#### [C-C++开发](./files/C-C++开发.md)
#### [任意C/C++工程如何使跳转等编辑功能正常工作clangd](./files/任意C-C++项目如何使跳转等编辑功能正常工作.md)
#### [Java开发](./files/Java开发.md)
#### [Python开发](./files/Python开发.md)
@ -39,4 +41,5 @@
#### [历史调试](./files/历史调试.md)
#### [问题反馈](./files/问题反馈.md)