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

基于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路径。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/610857.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

23种设计模式精讲,配套23道编程题目 ,支持 C++、Java、Python、Go

关于设计模式的学习,大家应该还是看书或者看博客,但却没有一个边学边练的学习环境。 学完了一种设计模式 是不是应该去练一练? 所以卡码网 针对 23种设计,推出了 23道编程题目,来帮助大家练习设计模式,地…

【机器视觉】机器视觉实验一——图像边缘检测

一、实验要求 1.读取文件并且将图片转为8bit;完成图像的拼接;图像框选 2边缘检测的主要步骤是: (1)为每个像素分配分数; (2) 沿垂直于边缘的方向找到局部最大值。有时执行第三步,传播局部证据,以便长轮廓更加自信,或者强边缘增强附近弱边缘的自信。 构建一个简单…

零代码实现接口自动化测试-RF框架实践

robotframework是一款关键字自动化测试框架,可能做各种类型的自动化测试。本文介绍通过 robotframework 来实现接口测试。 安装接口请求的第三方库 pip install robotframework-requests 在python安装目录的Lib\site-packages可以看到 接口关键字基础 robotfram…

CHS_03.1.3.3+系统调用

CHS_03.1.3.3系统调用 系统调用什么是系统调用,有何作用?系统调用又和普通的库函数的调用又有一定的区别为什么系统调用是必须的系统调用 按功能分类 可以分为这样的一些系统调用系统调用过程 这个小节的全部内容 系统调用 相关的知识 我们会为大家介绍什…

在visual studio中调试时无法查看std::wstring

1.问题 在调试的时候发现std::wstring类型的变量查看不了,会显示(error)|0,百思不得其解。 2.解决方法 参考的:vs2015调试时无法显示QString变量的值,只显示地址_vs调试qstring的时候如何查看字符串-CSDN博客 在工具/选项/调试…

performClick()方法

performClick()方法 大家好,我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天,让我们一同深入探讨Android开发中一个重要而常用的方法——“performClick()使…

R语言【sp】——SpatialPoints():创建类SpatialPoints或SpatialPointsDataFrame的对象

Package sp version 1.5-0 Description 从坐标或数据帧的坐标创建类 SpatialPoints-class 或 SpatialPointsDataFrame-class 的对象。 Usage SpatialPoints(coords, proj4stringCRS(as.character(NA)), bbox NULL)SpatialPointsDataFrame(coords, data, coords.nrs numeric…

Q-BENCH: A BENCHMARK FOR GENERAL-PURPOSEFOUNDATION MODELS ON LOW-LEVEL VISION

继续分享Q系列文章,今天分享Q-BENCH。 简单来说,作者对MLLMs在lowlevel领域中的评价提出了一个测试基准,主要分三点进行讲述。 有点类似于综述,显然作者团队在MLLM的lowlevel领域属于开山之作了。 第一个基准叫感知Perception 简…

Python从入门到网络爬虫(OS模块详解)

前言 本章介绍python自带模块os,os为操作系统 operating system 的简写,意为python与电脑的交互。os 模块提供了非常丰富的方法用来处理文件和目录。通过使用 os 模块,一方面可以方便地与操作系统进行交互,另一方面页可以极大增强…

论文阅读《Generalizing Face Forgery Detection with High-frequency Features》

高频噪声分析会过滤掉图像的颜色内容信息。 本文设计了三个模块来充分利用高频特征, 1.多尺度高频特征提取模块 2.双跨模态注意模块 3.残差引导空间注意模块(也在一定程度上体现了两个模态的交互) SRM是用于过滤图像的高频噪声 输入的图…

【C++期末】酒店住宿信息管理系统(含easyX)

诚接计算机专业编程作业(C语言、C、Python、Java、HTML、JavaScript、Vue等),如有需要请私信我,或者加我的企鹅号:1404293476 本文资源:https://download.csdn.net/download/weixin_47040861/88725363 目录 1.题目要求 2.实现效…

Vue3:Axios配置及使用

Axios官方 一、安装: //使用 npm: $ npm install axios//使用 bower: $ bower install axios//使用 yarn: $ yarn add axios 在package-lock.json文件可以查看axios版本 二、配置: milliaAxios.js 配置axios import axios from axios // 创建一个 ax…

element的Table表格组件树形数据与懒加载简单使用

目录 1. 代码实现2. 效果图3. 解决新增、删除、修改之后树节点不刷新问题。&#xff08;[参考文章](https://blog.csdn.net/weixin_41549971/article/details/135504471)&#xff09; 1. 代码实现 <template><div><!-- lazy 是否懒加载子节点数据 --><!-…

美信科技盘古信息智能车间项目成功验收,打造电子元器件数字化工厂标杆

作为一家深耕于磁性元器件领域近二十年的制造企业&#xff0c;广东美信科技股份有限公司&#xff08;以下简称“美信科技”&#xff09;始终秉承着“为电磁赋能&#xff0c;创工业至美”的企业使命&#xff0c;为中国制造卓越发展贡献力量。在当今数字化时代&#xff0c;制造企…

代码随想录算法训练营第二天| 977 有序数组的平方 209 长度最小的子数组 59 螺旋矩阵 ||

目录 977 有序数组的平方 209 长度最小的子数组 59 螺旋矩阵 || 977 有序数组的平方 先使数组存储递减序列&#xff0c;最后反转数组使其非递减 class Solution { public:vector<int> sortedSquares(vector<int>& nums) {int l 0,r nums.size() - 1;vecto…

【C++】深入了解构造函数之初始化列表

目录 一、再谈构造函数 1、引入 1&#xff09;构造函数体赋值 2&#xff09;不同成员变量赋值 2、初始化列表 一、再谈构造函数 1、引入 1&#xff09;构造函数体赋值 在创建对象时&#xff0c;编译器通过调用构造函数&#xff0c;给对象中各个成员变量一个合适的初始值…

世邦spon IP网络对讲广播系统任意文件上传漏洞

产品介绍 世邦通信IP网络对讲广播系统采用领先的IPAudio™技术,将音频信号以数据包形式在局域网和广域网上进行传送,是一套纯数字传输系统。 漏洞描述 spon IP网络对讲广播系统存在任意文件上传漏洞&#xff0c;攻击者可以通过构造特殊请求包上传恶意后门文件&#xff0c;从…

深入理解 Flink(一)Flink 架构设计原理

大数据分布式计算引擎设计实现剖析 MapReduce MapReduce 执行引擎解析 MapReduce 的组件设计实现图 Spark 执行引擎解析 Spark 相比于 RM 的真正优势的地方在哪里&#xff1a;&#xff08;Simple、Fast、Scalable、Unified&#xff09; DAG 引擎中间计算结果可以进行内存持…

掌握设计模式:深入了解命令模式的优雅调度与行为解耦

命令模式是一种行为设计模式&#xff0c;其目的是将请求发送者和接收者解耦&#xff0c;从而允许发送者发送请求&#xff0c;而无需知道请求的具体处理方式。在命令模式中&#xff0c;请求被封装为一个对象&#xff0c;这个对象包含了执行请求所需的所有信息&#xff0c;包括调…

spring源码解析(六)

bean对象的初始化及销毁时&#xff0c;执行相关操作的几种方式。 package com.test;import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.InitializingBean; import org.springframework.context.annotation.AnnotationConfi…