ARTICLE · 1078529
vscode识别uboot/Linux源码宏定义、头文件
vscode识别uboot/Linux源码宏定义、头文件用vscode阅读uboot/linux内核源码,默认情况下只支持C语言的语法高亮,而源码中有大量的CONFIG_XXX宏定义,头文件是编译过程中隐式指定的,直接在这个环境下写代码就会出现宏定义、函数原型、结构体类型报错的问题。 为了能在vscode里阅读和编辑uboot和Linux源码,可以用clangd + vscode clangd插件来解析编译过程,正确识别宏定义和函数、结构体类型定义。 注意: 这里的步骤只是粗略的框架,实际操作中可能因为各种编译命令、编译环境的差异,导致具体配置有差异,必要时请借助AI工具来调整配置的内容 在ubuntu主机安装bear工具,获取make过程输出的命令行信息,生成compile_commands.json文件,给clangd工具识别编译参数。 结合了bear的make命令: compile_commands.json文件记录了每个 .c 的完整编译命令(编译器路径、-I 头文件路径、-D 宏定义等),是 clangd 解析项目结构的依据。 clangd 是语言服务器(LSP),负责代码补全、跳转、诊断等 IDE 功能 clang 是编译器,负责把代码编译成可执行文件 这个插件只是一个"前端客户端",它通过 LSP 协议和后台运行的 clangd 程序通信。 
在代码根目录下创建.vscode目录,新建一个settings.json配置文件,加入clangd的相关配置: 在代码根目录下创建一个.clangd 文件,这里是配置clangd的工作参数,与具体开发板的编译参数相关性很强,以下代码只是以imx6开发板为例,其他开发板需要根据情况调整 以上步骤做完之后重启vscode,再次打开uboot/linux源码就能正常识别代码里的CONFIG_XXX条件编译宏和头文件、函数和结构体定义了。 条件编译被正确识别:
步骤1: 安装bear工具
bear make ARCH=arm CROSS_COMPILE=arm-poky-linux-gnueabi- -j8步骤2: 安装clang、clangd工具
sudo apt install clangd-12sudo apt install clang
步骤3:vscode安装clangd插件

步骤4: 修改settings.json 配置
// 识别bear工具生成的compile_commands.json"C_Cpp.default.compileCommands": "${workspaceFolder}/compile_commands.json","C_Cpp-flylint.enable": false,// clangd的可执行文件路径"clangd.path": "/usr/local/clangd-12/bin/clangd",// clangd的执行参数"clangd.arguments": ["--background-index","--compile-commands-dir=${workspaceFolder}","--completion-style=detailed","--header-insertion=never","--query-driver=**/arm-poky-linux-gnueabi-gcc","--log=verbose"],"C_Cpp.intelliSenseEngine": "disabled",
步骤5: 创建.clangd 文件
CompileFlags:Add:# 编译的目标架构- --target=arm-linux-gnueabihf# 编译器工具链的路径- --sysroot=/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/cortexa7hf-neon-poky-linux-gnueabi# 编译器相关的头文件路径- -I/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/cortexa7hf-neon-poky-linux-gnueabi/usr/include- -I/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/x86_64-pokysdk-linux/usr/lib/arm-poky-linux-gnueabi/gcc/arm-poky-linux-gnueabi/5.3.0/include- -I/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/x86_64-pokysdk-linux/usr/lib/arm-poky-linux-gnueabi/gcc/arm-poky-linux-gnueabi/5.3.0/include-fixedRemove:# 移除clangd不能识别的编译器参数- -f*- -m*