【vscode基于clangd实现Android/Linux代码跳转】

这篇具有很好参考价值的文章主要介绍了【vscode基于clangd实现Android/Linux代码跳转】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

一、准备工作

首先自然就是卸载vscode官方提供的C/C++因为功能和clangd会有冲突,建议直接删除(禁用)
准备所需插件:主要有两个clangd以及SSH(按需求安装)
1.clangd
linux源码跳转,vscode,android,linux
2.SSH(使用远程服务器配置)
linux源码跳转,vscode,android,linux

二、本地vscode链接到远程服务器(本地配置过可跳过)

参考:vscode连接SSH远程服务器(详细版)

三、clangd配置

3.1下载clangd

安装好clangd插件之后只是一个套壳现在代码是不能跳转的,需要通过clangd language的支持来完成跳转,clangd language的下载方式有两种方法
方式一:
下载好之后任意打开一个C/CPP文件,vscode下方会出现弹窗直接install即可(若网络原因或其他原因这里一直下载不出来请参考方式二)
linux源码跳转,vscode,android,linux
方式二:
从GitHub上下载clangd-language
linux源码跳转,vscode,android,linux
选择最新的版本即可,开发环境是linux选择linux即可,博主这里选用的就是linux,其他系统同理。
将下载好的clangd解压到任意一个path下,如下

cd /home/zly/tools/
unzip clangd_16.0.2.zip

在vscode上按住ctrl+,进入配置选项,如下在clangd中填写我们下载好的language的path。
linux源码跳转,vscode,android,linux

3.2配置clangd(重点)

clangd准备工作在上述,虽然已经基本完成,但是如果打开工程代码还是会发现代码还是不能够任意跳转,这是因为clangd查询不到对应的工程头文件,因此需要生成compile_commands.json,使用compile_commands.json文件来生成索引文件,这样当我们点击某个函数时可以飞快跳转到它定义的地方。

compile_commands.json文件中记录的是每个文件的编译选项,样式如下:

    {
        "arguments": [
            "/home/zly/work/prebuilts/gcc/linux-x86/arm/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc",
            "-c",
            "-Wp,-MD,cmd/.test.o.d",
            "-nostdinc",
            "-isystem",
            "/home/zly/work/prebuilts/gcc/linux-x86/arm/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf/bin/../lib/gcc/arm-linux-gnueabihf/6.3.1/include",
            "-Iinclude",
            "-I./arch/arm/include",
            "-include",
            "./include/linux/kconfig.h",
            "-D__KERNEL__",
            "-D__UBOOT__",
            "-Wall",
            "-Wstrict-prototypes",
            "-Wno-format-security",
            "-fno-builtin",
            "-ffreestanding",
            "-fshort-wchar",
            "-Werror",
            "-Os",
            "-fno-stack-protector",
            "-fno-delete-null-pointer-checks",
            "-g",
            "-fstack-usage",
            "-Wno-format-nonliteral",
            "-Werror=date-time",
            "-D__ARM__",
            "-Wa,-mimplicit-it=always",
            "-mthumb",
            "-mthumb-interwork",
            "-mabi=aapcs-linux",
            "-mword-relocations",
            "-fno-pic",
            "-mno-unaligned-access",
            "-mabi=aapcs-linux",
            "-funwind-tables",
            "-ffunction-sections",
            "-fdata-sections",
            "-fno-common",
            "-ffixed-r9",
            "-msoft-float",
            "-pipe",
            "-march=armv7-a",
            "-D__LINUX_ARM_ARCH__=7",
            "-I./arch/arm/mach-rockchip/include",
            "-DKBUILD_STR(s)=#s",
            "-DKBUILD_BASENAME=KBUILD_STR(test)",
            "-DKBUILD_MODNAME=KBUILD_STR(test)",
            "-o",
            "cmd/test.o",
            "cmd/test.c"
        ],
        "directory": "/home/zly/work/u-boot",
        "file": "cmd/test.c"
    },

生成compile_commands.json

compile_commands.json(也就是compilationdatabase,具体详细规范可以参考clangd说明)给clangd传递这些参数。
接下来通过kernel以及Android工程来分别生成compile_commands.json,
一、kernel中生成compile_commands.json

方法a:(注意!进行以下操作前需要确保工程提前被编译过
kernel中自带了scripts/clang-tools/gen_compile_commands.py可以直接生成(低内核版本没有该脚本,可以从网上下载一个)

  • 编译一遍kernel
zly@zly-machine:~/work$ ./build.sh kernel
  • 通过find -name "*.cmd"确认是否生成
........................................
./kernel/arch/arm/lib/.memchr.o.cmd
./kernel/arch/arm/lib/.lib1funcs.o.cmd
./kernel/arch/arm/lib/.call_with_stack.o.cmd
........................................
  • 执行gen_compile_commands.py在当前目录下生成compile_commands.json
zly@zly-machine:~/work/kernel$ python3 ./scripts/clang-tools/gen_compile_commands.py

  • cp compile_commands.json到kernel目录下

方法b:(注意工程要没有编译过!若编译过make clean一下)
通过使用bear来生成:Bear 是一个用于生成编译器的工具,它可以将编译器前端的源代码转换成抽象语法树(AST)并输出到一个JSON文件中。

  • 安装bear
zly@zly-machine:~$ sudo apt-get install bear
  • 使用bear命令来生成compile_commands.json
    用法如下:
bear make [其他make本身的参数]

它会记录make过程编译文件时用到的命令。
所以我们编译内核的目的是生成compile_commands.json,执行如下命令:

zly@zly-machine:~/work$ bear ./build.sh kernel

同样会生成compile_commands.json,将该json,cp到我们对应的工程下即可。

二、Android中生成compile_commands.json
安卓和kernel其实是同理的,但是安卓工程更加庞大,在安卓7之后基本工程直接使用ninja来进行编译构建的,因此我们可以直接通过ninjia快速构建同步生成对应的compile_commands.json.
ninja提供了一个工具(-t commands)可以生成特点目标的编译命令:

ninja -f combined-hal.ninja -t commands MODULES-IN-vendor-rockchip > commands.txt

使用gen_compdb:
gen_compdb: -c -i commands.txt -o compile_commands.json
cp compile_commands.json ./work

restart clangd server

综上将compile_commands.json生成好并且放到相关工程中即可,正式使用了,使用前,在vscode重启下clangd:ctrl+shift+p
linux源码跳转,vscode,android,linux
之后就可以实现代码的任意跳转了~,clangd功能十分强大!不单单只有代码跳转那么简单,还可以为代码提供补全、错误提示、跳转、导航等功能。

四、clangd简介

clangd是一个C/C++语言的基于LSP的语言服务实现,可以为代码提供补全、错误提示、跳转、导航等功能。

1.代码补全、跳转、导航、查看引用、查看实现

代码补全:
linux源码跳转,vscode,android,linux
转到定义、引用、实现:
linux源码跳转,vscode,android,linux
快速定位:(ctrl+shift+o、ctrl+T)
linux源码跳转,vscode,android,linux

2.错误提示、静态检查

错误提示:
linux源码跳转,vscode,android,linux
静态检查:快速修复
linux源码跳转,vscode,android,linux

3.格式化代码

对整个文件(Shitft+Alt+F),选中区域格式化(Ctrl+K Ctrl+F)
linux源码跳转,vscode,android,linux

4.重构

5.悬浮提示

linux源码跳转,vscode,android,linux
按住ctrl+左键即可跳跃到对应函数文章来源地址https://www.toymoban.com/news/detail-674427.html

到了这里,关于【vscode基于clangd实现Android/Linux代码跳转】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • VSCode使用clangd构建Linux驱动开发环境

    最初在使用Linux内核源码进行驱动开发时,由于没有代码补全、自动提示等功能写起来十分不方便,虽然有人使用Source Insight来阅读源码,但是我用起来还是感觉怪怪的,有时间同一个函数会找到很多的定义,不便判断。在调用层次方面,还是clangd更好用。 Clangd 是一个基于

    2024年01月16日
    浏览(55)
  • Linux下使用VScode开发ROS时clangd插件的使用

    本人在最近刚开始接触Linux和ROS开发,在开发过程中发现,微软的C/C++的intelliSense的代码补全,纠错等功能是真的难用,恰好有学长跟我提起了clangd这个东西,而且以前用clion去写一些小的C/C++工程,想着怎么去配置一下在vscode上使用clangd,让自己写代码更舒服一些(主要是太

    2024年02月02日
    浏览(30)
  • VSCode C/C++无法跳转到定义(又是你 clangd !)

    原博客:VSCode C/C++无法跳转到定义、自动补全、悬停提示功能_c/c++:edit configurations(json)-CSDN博客  我在此基础上加一点: 首先确保自己有这个插件: 点击 齿轮⚙ 符号,进入 配置设置,找到 把 C_cpp : Intelli Sense Engine 的内容设置为 default  如果设置不了,那就吧clangd这个扩展禁

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

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

    2024年02月20日
    浏览(33)
  • clangd的使用,实现跳转提示

    一、插件卸载c插件下载clangd 二、设置搜索clangd 若没有找到compile_commands.json文件可以通过如下方式之后再便于即可生成 cmake项目: 在项目最顶层的.cmake文件中或者CMakeList文件中加入如下命令 或者 makefile项目: ①安装bear ② 编译时用 若后面突然失灵了 找到/home/xuerui/.vscode-s

    2024年02月10日
    浏览(31)
  • 【深度学习】vscode实现代码跳转功能

    在远程访问Linux服务器,使用vscode软件代码不能实现跳转主要是由于没有配置解释器,故对其配置解释器即可实现该功能。 在vscode中安装Python,如下图所示 在vscode中安装Pylance,如下图所示 如下图所示,在vscode软件右下角点击后选择对应自己的解释器即可 在File -- Preferences

    2024年02月17日
    浏览(33)
  • 【Linux | C++ 】基于环形队列的多生产者多消费者模型(Linux系统下C++ 代码模拟实现)

    在上一篇文章中,我们深入探讨了Linux操作系统中的POSIX信号量,这是一个强大的同步机制,用于协调进程或线程对共享资源的访问。通过对信号量的深入理解和应用,我们学习了如何有效地解决并发编程中的竞争条件,确保程序的稳定性和效率。随着并发编程技术的不断深入

    2024年02月21日
    浏览(64)
  • Linux Ubuntu18.04配置Unity3D开发环境并解决VSCode中Dotnet Mono Omnisharp等问题实现MonoBehaviour代码提示

    如果说Windows安装Unity3D、配置Unity3D开发环境已经让人头疼。那么,Linux中搭建Unity3D开发环境就更加让人癫狂了。网上这类教程很少,出现问题都找不到现成的解决方法,很多坑都是自己不断尝试,填补过来的。大致分为以下几个坑:1.Ubuntu18.04配置Unity3D软件不成功;2.VSCode识别

    2024年02月14日
    浏览(42)
  • 为vscode配置clangd

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

    2023年04月08日
    浏览(34)
  • Linux环境使用VSCode调试简单C++代码

    本文将通过演示一个简单C++代码的编译调试过程,介绍在VSCode中如何使用Linux环境下的GCC C++编译器(g++)和GDB 调试器(gdb)。 关于GCC、g++、gcc、gdb,这里不做详细介绍,如果感兴趣可以参考另一篇文章:详解C/C++代码的预处理、编译、汇编、链接全过程,里面有详细的解释。 看懂

    2024年02月04日
    浏览(40)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包