VScode clangd 插件浏览 linux 源码

文章目录

  • [VScode clangd 插件浏览 linux 源码](#VScode clangd 插件浏览 linux 源码)
    • [clangd 安装与配置](#clangd 安装与配置)
      • [VScode 插件安装](#VScode 插件安装)
      • [clangd 安装](#clangd 安装)
      • [clangd 配置](#clangd 配置)
    • [cmake 生成](#cmake 生成)
    • [bear 生成 `compile_commands.json`](#bear 生成 compile_commands.json)
      • [触发 clangd](#触发 clangd)
    • [linux 内核脚本生成 `compile_commands.json` 文件](#linux 内核脚本生成 compile_commands.json 文件)
    • 三种方式对比

VScode clangd 插件浏览 linux 源码

VScode clangd 插件浏览代码却决于 compile_commands.json 文件

生成该文件有很多种方法

  • bear 命令
  • linux 内核脚本
  • cmake 编译选项

clangd 安装与配置

VScode 插件安装

在 VScode 插件商城搜索安装即可

clangd 安装

方法一

插件下载好之后任意打开一个 C/CPP 文件,vscode 下方会出现弹窗直接 install 即可(若网络原因或其他原因这里一直下载不出来请参考方式二)

方法二

从GitHub上下载 clangd-language,网址:https://githubfast.com/clangd/clangd/releases/

选择适合自己的即可,解压之后需要告诉 VScode 你的 clangd 的地址

Ctrl + , 打开配置,输入 clangd

输入自己的 path 即可(如果是方法一这里会自动填充)

shell 复制代码
/home/tyustli/.vscode-server/data/User/globalStorage/llvm-vs-code-extensions.vscode-clangd/install/16.0.2/clangd_16.0.2/bin/clangd

clangd 配置

由于 clangd 插件和 c/c++ 插件会存在冲突,在 ./vscode/settings.json 文件中添加下面一行配置,将 C/C++ 功能禁止掉

json 复制代码
"C_Cpp.intelliSenseEngine": "disabled",

cmake 生成

cmake工程生成 compile_commands.json 文件比较简单,定义 CMAKE_EXPORT_COMPILE_COMMANDS 即可。

shell 复制代码
cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=1

bear 生成 compile_commands.json

不过很多工程都是用 Makefile 来编译的,例如 linux 内核,没有现成的选项生成 compile_commands.json 文件。我们可以通过 bear 来生成。

bear 生成之前需要确保没有编译过,或者 make clean 一下,否则生成的文件是空的!!!

安装 bear

shell 复制代码
sudo apt-get install bear

使用 bear -- make 编译(之前的命令是 bear make)

编译 linux 内核生成

shell 复制代码
export ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf-   # 设置编译平台和工具链
make vexpress_defconfig                                 # 加载板子的配置信息
make dtbs                                               # 编译设备树
bear -- make -j8                                                # 编译内核

生成之后将 /usr/bin/gcc 全局搜索替换为自己工具链路径 /home/tyustli/cross_tool/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf/bin/arm-none-linux-gnueabihf-gcc

生成的部分 compile_commands.json 文件如下

json 复制代码
  {
    "arguments": [
      "/home/tyustli/cross_tool/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf/bin/arm-none-linux-gnueabihf-gcc",
      "-Wp,-MMD,scripts/mod/.empty.o.d",
      "-nostdinc",
      "-I./arch/arm/include",
      "-I./arch/arm/include/generated",
      "-I./include",
      "-I./arch/arm/include/uapi",
      "-I./arch/arm/include/generated/uapi",
      "-I./include/uapi",
      "-I./include/generated/uapi",
      "-include",
      "./include/linux/compiler-version.h",
      "-include",
      "./include/linux/kconfig.h",
      "-include",
      "./include/linux/compiler_types.h",
      "-D__KERNEL__",
      "-mlittle-endian",
      "-D__LINUX_ARM_ARCH__=7",
      "-fmacro-prefix-map=./=",
      "-std=gnu11",
      "-fshort-wchar",
      "-funsigned-char",
      "-fno-common",
      "-fno-PIE",
      "-fno-strict-aliasing",
      "-Wall",
      "-Wundef",
      "-Werror=implicit-function-declaration",
      "-Werror=implicit-int",
      "-Werror=return-type",
      "-Werror=strict-prototypes",
      "-Wno-format-security",
      "-Wno-trigraphs",
      "-fno-dwarf2-cfi-asm",
      "-mno-fdpic",
      "-fno-ipa-sra",
      "-mtp=cp15",
      "-mabi=aapcs-linux",
      "-mfpu=vfp",
      "-funwind-tables",
      "-marm",
      "-Wa,-mno-warn-deprecated",
      "-march=armv7-a",
      "-msoft-float",
      "-Uarm",
      "-fno-delete-null-pointer-checks",
      "-Wno-frame-address",
      "-Wno-format-truncation",
      "-Wno-format-overflow",
      "-Wno-address-of-packed-member",
      "-O2",
      "-fno-allow-store-data-races",
      "-Wframe-larger-than=1024",
      "-fstack-protector-strong",
      "-Wno-main",
      "-Wno-unused-but-set-variable",
      "-Wno-unused-const-variable",
      "-fomit-frame-pointer",
      "-fno-stack-clash-protection",
      "-Wvla",
      "-Wno-pointer-sign",
      "-Wcast-function-type",
      "-Wno-stringop-truncation",
      "-Wno-stringop-overflow",
      "-Wno-restrict",
      "-Wno-maybe-uninitialized",
      "-Wno-alloc-size-larger-than",
      "-Wimplicit-fallthrough=5",
      "-fno-strict-overflow",
      "-fno-stack-check",
      "-fconserve-stack",
      "-Werror=date-time",
      "-Werror=incompatible-pointer-types",
      "-Werror=designated-init",
      "-Wno-packed-not-aligned",
      "-g",
      "-fplugin=./scripts/gcc-plugins/arm_ssp_per_task_plugin.so",
      "-DKBUILD_MODFILE=\"scripts/mod/empty\"",
      "-DKBUILD_BASENAME=\"empty\"",
      "-DKBUILD_MODNAME=\"empty\"",
      "-D__KBUILD_MODNAME=kmod_empty",
      "-c",
      "-o",
      "scripts/mod/empty.o",
      "scripts/mod/empty.c"
    ],
    "directory": "/home/tyustli/code/open_source/kernel/linux-6.5.7",
    "file": "/home/tyustli/code/open_source/kernel/linux-6.5.7/scripts/mod/empty.c",
    "output": "/home/tyustli/code/open_source/kernel/linux-6.5.7/scripts/mod/empty.o"
  },

从该文件可以看到,每个编译的文件的详细信息都被记录在 compile_commands.json 文件中。

触发 clangd

在 VScode 里打开任意一个 C 文件,就会触发 clangd 建立索引:

如果正在建立索引,显示的是 indexing:1276/1699

索引建立完成之后

如果索引建立完成轴,显示的是 clangd: idle

此时 linux 代码可以任意跳转了。

linux 内核脚本生成 compile_commands.json 文件

linux 内核提供了生成该文件的脚本

shell 复制代码
scripts/clang-tools/gen_compile_commands.py 

执行该脚本之前需要确保内核已经编译过!!!

执行该脚本即可生成 compile_commands.json 文件

python 复制代码
python3 ./scripts/clang-tools/gen_compile_commands.py 

生成的部分内容如下

json 复制代码
  {
    "command": "arm-none-linux-gnueabihf-gcc -Wp,-MMD,block/.genhd.o.d -nostdinc -I./arch/arm/include -I./arch/arm/include/generated  -I./include -I./arch/arm/include/uapi -I./arch/arm/include/generated/uapi -I./include/uapi -I./include/generated/uapi -include ./include/linux/compiler-version.h -include ./include/linux/kconfig.h -include ./include/linux/compiler_types.h -D__KERNEL__ -mlittle-endian -D__LINUX_ARM_ARCH__=7 -fmacro-prefix-map=./= -std=gnu11 -fshort-wchar -funsigned-char -fno-common -fno-PIE -fno-strict-aliasing -Wall -Wundef -Werror=implicit-function-declaration -Werror=implicit-int -Werror=return-type -Werror=strict-prototypes -Wno-format-security -Wno-trigraphs -fno-dwarf2-cfi-asm -mno-fdpic -fno-ipa-sra -mtp=cp15 -mabi=aapcs-linux -mfpu=vfp -funwind-tables -marm -Wa,-mno-warn-deprecated -march=armv7-a -msoft-float -Uarm -fno-delete-null-pointer-checks -Wno-frame-address -Wno-format-truncation -Wno-format-overflow -Wno-address-of-packed-member -O2 -fno-allow-store-data-races -Wframe-larger-than=1024 -fstack-protector-strong -Wno-main -Wno-unused-but-set-variable -Wno-unused-const-variable -fomit-frame-pointer -fno-stack-clash-protection -Wvla -Wno-pointer-sign -Wcast-function-type -Wno-stringop-truncation -Wno-stringop-overflow -Wno-restrict -Wno-maybe-uninitialized -Wno-alloc-size-larger-than -Wimplicit-fallthrough=5 -fno-strict-overflow -fno-stack-check -fconserve-stack -Werror=date-time -Werror=incompatible-pointer-types -Werror=designated-init -Wno-packed-not-aligned -g -fplugin=./scripts/gcc-plugins/arm_ssp_per_task_plugin.so -fplugin-arg-arm_ssp_per_task_plugin-offset=1248    -DKBUILD_MODFILE='\"block/genhd\"' -DKBUILD_BASENAME='\"genhd\"' -DKBUILD_MODNAME='\"genhd\"' -D__KBUILD_MODNAME=kmod_genhd -c -o block/genhd.o block/genhd.c",
    "directory": "/home/tyustli/code/open_source/kernel/linux-6.5.7",
    "file": "/home/tyustli/code/open_source/kernel/linux-6.5.7/block/genhd.c"
  },

三种方式对比

  • cmake
    • 优点:简单,加入 cmake 选项即可
    • 缺点: 依赖于 cmake 工程
  • bear(未编译之前使用)
    • 优点:任意 Makefile 工程都能使用
    • 缺点:如果改动了源码或者文件依赖,bear 每次都要重新编译
  • linux 脚本(编译之后使用)
    • 优点:简单,只需要 python 执行一下即可
    • 缺点:局限于 linux 工程

对于研究 linux 内核,直接使用 linux 提供的脚本这种方法最合适。

相关推荐
伤不起bb1 小时前
MySQL 高可用
linux·运维·数据库·mysql·安全·高可用
tmacfrank4 小时前
网络编程中的直接内存与零拷贝
java·linux·网络
谢尔登7 小时前
【VSCode】修改侧边文件资源管理器中的文件夹折叠模式
ide·vscode·编辑器
QQ2740287567 小时前
Soundness Gitpod 部署教程
linux·运维·服务器·前端·chrome·web3
qwfys2007 小时前
How to configure Linux mint desktop
linux·desktop·configure·mint
南方以南_7 小时前
Ubuntu操作合集
linux·运维·ubuntu
冼紫菜8 小时前
[特殊字符]CentOS 7.6 安装 JDK 11(适配国内服务器环境)
java·linux·服务器·后端·centos
bloglin999998 小时前
关闭VSCode 自动更新
ide·vscode·编辑器
Chuncheng's blog9 小时前
RedHat7 如何更换yum镜像源
linux
爱莉希雅&&&9 小时前
shell脚本之条件判断,循环控制,exit详解
linux·运维·服务器·ssh