1. 准备工作:创建项目文件

废话篇(可以略过~):韦东山老师课程当中惯用了Souceinsight来进行查看代码,这里提供使用vscode来进行查看代码的功能,因为vscode功能扩展强大,不仅可以自己看还可以让身边的好朋友一起看,哈哈哈哈我说的是可以用codex,或者其它强大的ai辅助,这一点是vscode优势。

开始正题(韦东山老师的教程也给在后面了),然而本博客教程更简单操作😊👌

首先,在你的 Ubuntu 工作目录下创建一个新的驱动项目文件夹(例如char)。

  1. 编写源代码:这里创建 chardevbase.c,编写基础的字符设备驱动代码,在vscode当中打开文件夹

  2. 这里需要保存工作空间

  3. 编写 Makefile:这是 bear 工具生成索引的前提。内容示例如下(注意修改 KERN_DIR 为你的 SDK 路径):

创建一个可编译的Makefile文件,记录路径:

# 路径修改为你的内核源码绝对路径
KERN_DIR = /home/book/100ask_imx6ull-sdk/Linux-4.9.88

all:
	make -C $(KERN_DIR) M=`pwd` modules 

clean:
	make -C $(KERN_DIR) M=`pwd` modules clean

obj-m += chardevbase.o  
# 这里无比需要修改成和自己.c文件的名字一样,这里是编译出来对应.c文件的.o文件

2. 生成并修正编译数据库 (compile_commands.json)

这是实现 VS Code 代码自动补全和跳转的核心文件。

  1. 生成文件:在项目目录下打开终端,执行以下命令:

    codeBash
    make clean
    bear make

    此时目录下会生成 compile_commands.json。这里根据Makefile执行好了bear make指令

  2. 回到Vscode可以看到这个compile_commands.json

  3. 修正编译器 (CC) 路径
    使用 VS Code 打开该文件,按下 Ctrl + H

    • 查找:"cc"

    • 替换为:"arm-buildroot-linux-gnueabihf-gcc"

    • 点击“全部替换”,这一步很关键我自己之前就漏了这个cc是Ubuntu 自带的 x86 编译器这里需要改成arm架构的linux环境下的编译器

  4. 修正头文件相对路径
    继续按下 Ctrl + H(这是解决跳转失败的关键):

    • 查找:"-I./

    • 替换为:"-I/home/book/100ask_imx6ull-sdk/Linux-4.9.88/(填入内核源码绝对路径)

    • 点击“全部替换”。


3. 消除插件报错:配置 .clangd 文件

这一步需要先下载插件ctrl +shift+x可以快捷键打开扩展

这是一个非常好用的工具可以连接当前的工作环境和Linux源码下的文件

由于内核包含很多 clangd 无法识别的 GCC 参数,会导致大量标红。

  1. 在项目目录下新建一个名为 .clangd 的文件(注意点开头)。

  2. 输入以下配置:

codeYaml

CompileFlags:
  Remove: [
    -mapcs, 
    -mno-sched-prolog, 
    -fno-ipa-sra, 
    -mno-thumb-interwork, 
    -fno-var-tracking-assignments, 
    -fconserve-stack, 
    -mabi=*, 
    -marm, 
    -fno-if-conversion,
    -mthumb-interwork
  ]

4. VS Code 工作区配置

为了能跨文件夹跳转到内核源码,必须将内核文件夹加入工作区。

  1. 添加文件夹:点击 VS Code 菜单 文件 (File) -> 将文件夹添加到工作区 (Add Folder to Workspace...)。

  2. 选择内核:选择你的内核源码根目录(Linux-4.9.88)。


5. 配置 clangd 插件设置 

告诉 clangd 交叉编译器的位置,以获取标准头文件。

  1. 进入 VS Code 设置 (Ctrl + ,)。

  2. 搜索 clangd.arguments

  3. 添加一项内容(根据你的交叉编译器实际路径填写):
    --query-driver=/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin/arm-buildroot-linux-gnueabihf-gcc


6. 重启服务与验证

完成上述步骤后,必须重启语言服务。

  1. 重启命令:按下 Ctrl + Shift + P,输入并选择 clangd: Restart language server。

  2. 观察状态栏

    • 底部显示 clangd: indexing... 说明正在扫描代码。

    • 显示 clangd: idle 说明索引完成。

  3. 跳转验证

    • 打开 chardevbase.c。

    • #include <linux/module.h> 不再标红。

    • 按住 Ctrl 点击 module_init,应能瞬间跳转到内核源码的 include/linux/module.h 文件中。到这一步就恭喜你成功了!夸一夸自己吧!我真棒!哈哈哈哈哈哈哈

韦东山老师教程原网站:在Ubuntu中搭建嵌入式Linux开发环境_悦己之作,方能悦人的技术博客_51CTO博客


💡 总结一下常见报错

现象 原因 解决方法
include 标红 编译器路径或头文件路径不对 检查 json 文件中 cc 是否换成交叉编译器,-I./ 是否换成绝对路径
跳转没反应 内核没加入工作区 Add Folder to Workspace 加入内核源码目录
大量 Unknown argument 报错 .clangd 文件未生效 确保文件名为 .clangd(不能有后缀),且在驱动项目根目录
状态栏无 clangd 显示 插件没装在远程 在扩展商店点击“在 SSH 中安装”

更多推荐