VScode clangd 插件浏览 linux 源码

这篇具有很好参考价值的文章主要介绍了VScode clangd 插件浏览 linux 源码。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

VScode clangd 插件浏览 linux 源码

VScode clangd 插件浏览代码却决于 compile_commands.json 文件
生成该文件有很多种方法

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

clangd 安装与配置

VScode 插件安装

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

clangd 安装

方法一

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

方法二

从GitHub上下载 clangd-language,网址:https://githubfast.com/clangd/clangd/releases/
VScode clangd 插件浏览 linux 源码,# kernel,vscode,linux,clangd,bear
选择适合自己的即可,解压之后需要告诉 VScode 你的 clangd 的地址

Ctrl + , 打开配置,输入 clangd
VScode clangd 插件浏览 linux 源码,# kernel,vscode,linux,clangd,bear
输入自己的 path 即可(如果是方法一这里会自动填充)

/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++ 功能禁止掉

"C_Cpp.intelliSenseEngine": "disabled",

cmake 生成

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

cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=1

bear 生成 compile_commands.json

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

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

安装 bear

sudo apt-get install bear

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

编译 linux 内核生成

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 文件如下

  {
    "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 建立索引:
VScode clangd 插件浏览 linux 源码,# kernel,vscode,linux,clangd,bear
如果正在建立索引,显示的是 indexing:1276/1699

索引建立完成之后
VScode clangd 插件浏览 linux 源码,# kernel,vscode,linux,clangd,bear
如果索引建立完成轴,显示的是 clangd: idle

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

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

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

scripts/clang-tools/gen_compile_commands.py 

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

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

python3 ./scripts/clang-tools/gen_compile_commands.py 

生成的部分内容如下

  {
    "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 提供的脚本这种方法最合适。文章来源地址https://www.toymoban.com/news/detail-734616.html

到了这里,关于VScode clangd 插件浏览 linux 源码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • VScode 结合clangd 构建linux源代码阅读环境

    上一篇文章:VScode 结合Global构建linux源代码阅读环境 ,介绍了在VS Code工具中通过remote-ssh远程登陆到Linux远程服务器,使用Global构建linux源代码阅读环境,对linux kernel代码进行解析,实现全局搜索、自动跳转、代码补全等功能,但是Global工具在建立代码索引数据时,将整个Li

    2023年04月16日
    浏览(37)
  • 【vscode基于clangd实现Android/Linux代码跳转】

    背景: 在开发大型工程例如Android或Linux时若我们使用vscode搭配官方的C/C++插件使用发现,经常很多代码都无法跳转,代码补全功能几乎是废的,通过网友以及同事身边了解之后发现 vscode+clangd可以实现代码任意跳转补全等功能 ,因此本文通过讲解如何配置clangd相关环境实现高

    2024年02月11日
    浏览(37)
  • 看代码神器:vscode+clangd轻松实现linux内核代码跳转(图文并茂)

    一点感悟 还是那句老话:工欲善其事必先利其器。在做代码开发之前,先准备好开发过程帮助提效的工具,能起到事半功倍的效果。比如本文要讲的vscode下进行linux内核代码开发或者阅读就是很好例子,如果没有先把代码跳转等基础环境搭建好,对后续的代码阅读和开发都可

    2024年01月23日
    浏览(43)
  • vscode 阅读 android以及kernel 源码

    在Ubuntu系统中安装vscode 参考文档: https://blog.csdn.net/m0_57368670/article/details/127184424 1, 下载vscode https://code.visualstudio.com 2, 安装vscode $ sudo dpkg -i code_1.78.1-1683194560_amd64.deb 3, 打开vscode $ code vscode 阅读 android以及kernel 源码 参考文档: https://blog.csdn.net/lyndon_li/article/details/127955889 sudo

    2024年02月05日
    浏览(45)
  • 在Windows上使用VScode阅读kernel源码

    有一说一,在Windows上使用Source Inside阅读kernel源码真的很舒服,但是有时候带着轻薄本出去,又不想往轻薄本上安装很多的软件,就使用VS code临时阅读kernel源码。如果不能进行跳转,阅读kernel源码就很难受,今天就记录一下,如何配置VS code,可以方便地阅读kernel源码。 首先

    2024年01月18日
    浏览(41)
  • 为vscode配置clangd

    clangd能提供更好的补全和提示,自带检查一些warning的问题,可以减少大家未来找存在的warning的时间。经过配置可以在unittest和timetest中也实现自动补全,平均速度比vscode c/c++插件更快。 在插件市场搜索clangd。安装即可。注意c/c++可以不用卸载,否则调试可能会有点问题。 在

    2023年04月08日
    浏览(34)
  • 关于在Vscode安装clangd的教程(分别在linux和windows)[很详细,很细节,很全!]【Windows端:缺少 language enginee的解决方法】

    一.背景: 在Vscode中,使用c/c++ 编译器(插件),但是自带的补全语法不好 clang 也是个编译器,而其对应的clangd的补全语法的功能很友善 所以在Vscode中,我们可以使用插件c/c++编译和执行,但是补全的语法用clangd,话不多说,直接开干! 安装分为2部分,linux端和本地端 1.先在

    2024年02月20日
    浏览(33)
  • 走进前端和vscode插件安装、认识浏览器、Gitee提交

    前端的概念 首先我们先了解一下前端的通俗概念:前端即网站前台部分,运行在PC端,移动端等浏览器上展现给用户浏览的网页。随着互联网技术的发展,HTML5,CSS3,框架的应用,跨平台响应式网页设计能够适应各种屏幕分辨率,合适的动效设计,给用户带来极高的用户体验

    2023年04月17日
    浏览(35)
  • 基于VSCode的Linux内核调试环境搭建以及start_kernel跟踪分析

    参考ppt的步骤: 准备工作:1-5 ,配置vscode环境:6 ,跟踪分析:7。 目录 1.安装开发工具  2.下载内核源码  3.配置内核选项 4.编译和运行内核 5.制作内存根文件系统 *gdb调试(可跳过)  7.配置VSCode调试Linux内核  7.跟踪分析 下载出现了“Axel -n 20 :太多重定向”的问题,原因是

    2023年04月17日
    浏览(53)
  • vscode配置clangd和clang-format

    如何安装和配置vscode以搭建c++开发环境,可以查看我的另一篇博客:Windows上最轻量的vscode-C++开发环境搭建。 在这篇博客中,详细介绍了如何安装vscode以及应该安装哪些插件。这里不再赘述。 vscode中想使用clangd来作为语言服务器、clang-format来作为代码格式化工具,还需要额外

    2024年02月10日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包