我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

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

一、准备工作

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

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

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

三、clangd配置

3.1下载clangd

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

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

在vscode上按住ctrl+,进入配置选项,如下在clangd中填写我们下载好的language的path。
在这里插入图片描述

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
在这里插入图片描述
之后就可以实现代码的任意跳转了~,clangd功能十分强大!不单单只有代码跳转那么简单,还可以为代码提供补全、错误提示、跳转、导航等功能。

四、clangd简介

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

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

代码补全:
在这里插入图片描述
转到定义、引用、实现:
在这里插入图片描述
快速定位:(ctrl+shift+o、ctrl+T)
在这里插入图片描述

2.错误提示、静态检查

错误提示:
在这里插入图片描述
静态检查:快速修复
在这里插入图片描述

3.格式化代码

对整个文件(Shitft+Alt+F),选中区域格式化(Ctrl+K Ctrl+F)
在这里插入图片描述

4.重构

5.悬浮提示

在这里插入图片描述
按住ctrl+左键即可跳跃到对应函数

来源地址:https://blog.csdn.net/weixin_45281868/article/details/129979678

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

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

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

基于Android实现转盘按钮代码

先给大家展示下效果图:package com.lixu.circlemenu;import android.app.Activity;import android.os.Bundle;import android.view.View;imp
2022-06-06

android 跳转进市场的实现代码

跳转进市场的代码 代码如下:Intent intent = new Intent(Intent.ACTION_VIEW);2 intent.setData(Uri.parse("market://details?id=" + getPack
2022-06-06

基于Android代码实现常用布局

关于 android 常用布局,利用 XML 文件实现已经有很多的实例了。但如何利用代码实现呢?当然利用代码实现没有太大的必要,也是不提倡的,但我觉得利用代码实现这些布局,可以更好的了解 SDK API ,所以在此也整理一些,和大家分享一下
2022-06-06

基于Android中dp和px之间进行转换的实现代码

在xml布局文件中,我们既可以设置px,也可以设置dp(或者dip)。一般情况下,我们都会选择使用dp,这样可以保证不同屏幕分辨率的机器上布局一致。但是在代码中,如何处理呢?很多控件的方法中都只提供了设置px的方法,例如setPadding
2022-06-06

基于Socket.IO实现Android聊天功能代码示例

一、简述Socket.IO是一个完全由JavaScript实现、基于Node.js、支持WebSocket的协议用于实时通信、跨平台的开源框架,它包括了客户端的JavaScript和服务器端的Node.js。该种官方介绍看起来有点懵逼,简而
2023-05-30

Android 实现闪屏页和右上角的倒计时跳转实例代码

以前编程的时候,遇到倒计时的功能时,经常自己去写,但其实Android已经帮封装好了一个倒计时类CountDownTimer,其实是将后台线程的创建和Handler队列封装成为了一个方便的类调用。 闪屏页用到了handler和CountDo
2022-06-06

基于Java实现进制转换工具类的示例代码

这篇文章主要为大家详细介绍了如何基于Java实现进制转换工具类,从而实现减少参数长度的效果,文中的示例代码讲解详细,需要的可以参考一下
2023-02-19

Android基于广播事件机制实现简单定时提醒功能代码

本文实例讲述了Android基于广播事件机制实现简单定时提醒功能代码。分享给大家供大家参考,具体如下: 1.Android广播事件机制 Android的广播事件处理类似于普通的事件处理。不同之处在于,后者是靠点击按钮这样的组件行为来触发,而
2022-06-06

基于pdf2docx模块Python实现批量将PDF转Word文档的完整代码教程

这篇文章主要介绍了基于pdf2docx模块Python实现批量将PDF转Word文档的完整代码教程,PDF文件是一种常见的文档格式,如何转换成word呢,需要的朋友可以参考下
2023-05-15

编程热搜

目录