当前位置: 首页 > news >正文

【开发 | 环境配置】解决 VSCode 编写 eBPF 程序找不到头文件

问题描述:

在使用 vscode 编写 eBPF 程序时,如果不做一些头文件定位的操作,默认情况下头文件总是带有“红色下划线”,并且大部分的变量不会有提示与补全。

在编写代码文件较小时(或者功能需求小时)并不会带来不方便。

但在长时间编写以及多个程序文件都在使用时,无法补全和提示也影响着编程。

解决方案:

应用场景:

VSCode 编辑器、远程连接服务器开发模式、使用 clangd 插件

方案/方法:

> 这里默认已经可以运行 eBPF 程序了。

检查 clang 是否安装

sudo apt-get install clang

使用 clang --version 来验证是否安装成功。 

编写 Makefile 文件

可以随便写一个有效的 Makefile 文件。

# Makefile
CC=clang
CFLAGS=-I/usr/src/linux-headers-$(shell uname -r)/include -I/usr/src/linux-headers-$(shell uname -r)/include/uapiall: main.omain.o: src/main.c$(CC) $(CFLAGS) -o main.o -c src/main.cclean:rm -f main.o

安装 bear

bear 工具用于生成 compile_commands.json 文件。可以通过以下命令进行安装:

安装 bear 工具:

sudo apt-get install bear

生成 compile_commands.json 文件

在项目的根目录下运行 bear 来生成编译数据库文件。假设你使用的是 make 来构建项目:

bear -- make

compile_commands.json 文件

生成的 compile_commands 文件如下所示:

[{"directory": "/home/user/ning_ebpf","command": "clang -I/usr/src/linux-headers-$(uname -r)/include -I/usr/src/linux-headers-$(uname -r)/include/uapi -o main.o -c src/main.c","file": "src/main.c"}
]

配置 .clangd 文件

在项目根目录下创建或编辑 .clangd 文件,添加以下内容:

CompileFlags:Add: - -isystem- /usr/src/linux-headers-$(shell uname -r)/include- -isystem- /usr/src/linux-headers-$(shell uname -r)/include/uapi

配置 VS Code 使用上述生成的 compile_commands.json

确保 compile_commands.json 文件位于项目根目录: compile_commands.json 文件应该位于项目的根目录。VS Code 和 Clangd 会自动查找该文件。

settings.json 中添加以下配置:

{"clangd.path": "clangd","clangd.arguments": ["--compile-commands-dir=${workspaceFolder}"]
}

最终配置好后的项目目录如下:

(需要注意的是,这里没有使用项目的编程框架。)

生效与验证

  1. 重启 VS Code: 重启 VS Code 以确保配置生效。

  2. 查看 Clangd 输出: 在 VS Code 的输出窗口中选择 clangd,查看是否有错误信息。 

相关文章:

  • 【STM32嵌入式系统设计与开发---传感器拓展】——1_2_蓝牙主从模块_AT配置(HC-05)
  • Java学习-简单的用户管理系统
  • docker 挂载运行镜像
  • 旅游卡在哪里拿货?千益畅行旅游卡源头
  • docker image prune -f 命令什么用途
  • 数字化工厂怎么收集,处理数据?
  • Qt Creator(2)【如何在Qt Creator中创建新工程】
  • 【代码随想录算法训练Day13】LeetCode 239. 滑动窗口最大值、LeetCode 347.前K个高频元素
  • TypeScript-泛型
  • 提升(或降低)插入的内容的位置:\raisebox
  • 第十四届蓝桥杯c++研究生组
  • python 第四章 函数 (pycharm) (2)
  • 二分答案思想下的二进制问题
  • Python爬虫技术深度解析与实战案例
  • 基于51单片机简易温度计
  • [deviceone开发]-do_Webview的基本示例
  • 【391天】每日项目总结系列128(2018.03.03)
  • CentOS6 编译安装 redis-3.2.3
  • CentOS7简单部署NFS
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • extjs4学习之配置
  • Java IO学习笔记一
  • Javascript基础之Array数组API
  • Java方法详解
  • react 代码优化(一) ——事件处理
  • SpiderData 2019年2月25日 DApp数据排行榜
  • spring boot 整合mybatis 无法输出sql的问题
  • 编写高质量JavaScript代码之并发
  • 服务器之间,相同帐号,实现免密钥登录
  • 记一次用 NodeJs 实现模拟登录的思路
  • 警报:线上事故之CountDownLatch的威力
  • 力扣(LeetCode)965
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 源码安装memcached和php memcache扩展
  • Oracle Portal 11g Diagnostics using Remote Diagnostic Agent (RDA) [ID 1059805.
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • ​​​【收录 Hello 算法】10.4 哈希优化策略
  • ​flutter 代码混淆
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • # 利刃出鞘_Tomcat 核心原理解析(八)-- Tomcat 集群
  • #AngularJS#$sce.trustAsResourceUrl
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (zhuan) 一些RL的文献(及笔记)
  • (编译到47%失败)to be deleted
  • (黑马C++)L06 重载与继承
  • (六)激光线扫描-三维重建
  • (强烈推荐)移动端音视频从零到上手(下)
  • (三)docker:Dockerfile构建容器运行jar包
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (算法设计与分析)第一章算法概述-习题
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • (一) storm的集群安装与配置