基于Clangd索引Linux内核源代码,提供跳转和补全

本文介绍了如何在VSCode中配置Clangd以支持Linux内核的源代码编译,包括使用clang代替gcc、生成compile_commands.json、设置对应的clangd路径以及处理常见编译警告。
摘要由CSDN通过智能技术生成

基于Clangd索引Linux内核源代码,提供跳转和补全

适用于Neovim、Vim、VSCode等支持LSP的编辑器。

1 操作示例

1.1 操作环境

操作系统:Ubuntu 20.04 in wsl2
编辑器:VSCode
LSP:Clangd
内核版本:longterm 5.15.145

1.2 准备工作

由于gccclang并非完全兼容,使用gcc编译后生成的compile_commands.json中可能包含clangd无法识别的Unknown argument,导致clangd索引出现报错。故采用clang作为编译器。

由于编译该版本的Linux内核需要clang的最小版本为10.0.1,默认从仓库中安装的版本为10.0.0,不满足最小版本需求。因此需要执行如下命令安装更新版本的clang-12clangd-12

$ sudo apt install clang-12 clangd-12

注意:
clangclangd的版本需要对应。否则最后代码提示可能也会报Unknown argument错误。

1.3 编译Linux内核并生成compile_commands.json

  1. 官网下载Linux内核源代码
  2. 使用命令$ tar xvf linux-5.15.145.tar.xz解压源代码
  3. 进入解压后的源代码目录。
  4. 配置编译
    $ make CC=clang-12 defconfig # 由于默认的clang链接到了clang-10,不满足版本要求,故此处需要指定clang-12
    
  5. 执行编译
    $ make CC=clang-12 -j16
    
  6. 生成compile_commands.json
    $ python ./scripts/clang-tools/gen_compile_commands.py
    

1.4 编辑VSCode配置

  1. 用VSCode打开Linux内核源码文件夹
  2. 安装clangd插件
  3. 禁用C/C++插件的代码提示,在Workspace的settings.json中添加如下代码:
    "C_Cpp.intelliSenseEngine": "disabled",
    
  4. 设置clangd的路径。默认clangd的路径设置为clangd,表明VSCode会直接从环境变量中寻找可执行文件clangd。但由于默认的clangd链接到了clangd-10,我们编译内核使用的是clang-12,需要与其版本对应的clangd-12提供代码提示。因此这里需要根据你使用的clang版本设置与其对应的clangd可执行文件路径。由于笔者使用了clang-12,故需要在此使用clangd-12。在Workspace的settings.json中添加如下代码:
    "clangd.path": "clangd-12",
    
  5. 重启VSCode,加载插件和配置,发现能够正常完成源码索引,且没有报错。

2 常见问题

Unknown argument: '-fno-stack-clash-protection'
Unknown warning option '-Wno-frame-address'; did you mean '-Wno-address'?
Unknown warning option '-Wno-pointer-to-enum-cast'; did you mean '-Wno-pointer-compare'?
Unknown warning option '-Wno-frame-address'; did you mean '-Wno-address'?
Unknown warning option '-Wno-pointer-to-enum-cast'; did you mean '-Wno-pointer-compare'?
......

原因:

  1. 使用gcc编译,而gcc的某些编译选项clangd不支持。需要改用clang进行编译,或者在项目文件夹的.clangd配置文件中禁用这些不支持的编译选项。参考clangd文档
  2. 使用clang编译,但clang的版本和提供代码提示的clangd版本不对应,不同版本间clangd支持的编译选项也有差异。需要在VSCode等编辑器配置文件中指定和clang版本对应的clangd路径。
  • 28
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux内核源代码情景分析册高清带书签是一本重要的技术资料,它探讨了Linux内核的底层工作原理和实现细节。这本书详细介绍了Linux内核的各个组成部分,如进程管理、内存管理、文件系统、网络协议栈等,并通过实际的源代码解析,帮助读者深入理解Linux内核的设计和实现。 本书的特点之一是高清的图像质量,使读者能够清晰地查看源代码和注释,便于理解和学习。另外,书中还提供了书签功能,方便读者标记重要的章节和代码片段,便于后续的查找和参考。 通过对Linux内核源代码的情景分析,读者可以更好地理解Linux内核的工作原理和内部机制。例如,通过分析进程调度算法的源代码,读者可以了解进程的创建、调度和终止过程,进而理解操作系统是如何管理和调度多个进程的。 另外,通过分析内存管理的源代码,读者可以深入了解Linux内核是如何管理物理内存和虚拟内存的,理解内存分页、页表管理和内存分配等机制。 书中还介绍了Linux内核的文件系统实现,如Ext4和Btrfs等文件系统的源代码解析,读者可以了解文件系统的组织结构、索引和数据存储等细节。 此外,书中还涵盖了网络协议栈的实现,包括TCP/IP协议栈和网络设备驱动程序的源代码分析。通过分析这部分代码,读者可以了解Linux内核是如何处理网络数据包,实现网络协议的传输和处理。 总之,Linux内核源代码情景分析册高清带书签是一本重要的技术参考书籍,通过深入解析Linux内核源代码,帮助读者更好理解Linux操作系统的设计和实现。读者可以通过该书学习和掌握Linux内核的工作原理和内部机制,提高Linux系统的调试和优化能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值