背景: 在開發(fā)大型工程例如Android或Linux時(shí)若我們使用vscode搭配官方的C/C++插件使用發(fā)現(xiàn),經(jīng)常很多代碼都無(wú)法跳轉(zhuǎn),代碼補(bǔ)全功能幾乎是廢的,通過(guò)網(wǎng)友以及同事身邊了解之后發(fā)現(xiàn)vscode+clangd可以實(shí)現(xiàn)代碼任意跳轉(zhuǎn)補(bǔ)全等功能,因此本文通過(guò)講解如何配置clangd相關(guān)環(huán)境實(shí)現(xiàn)高效開發(fā)。
一、準(zhǔn)備工作
首先自然就是卸載vscode官方提供的C/C++因?yàn)楣δ芎蚦langd會(huì)有沖突,建議直接刪除(禁用)
準(zhǔn)備所需插件:主要有兩個(gè)clangd以及SSH(按需求安裝)
1.clangd
2.SSH(使用遠(yuǎn)程服務(wù)器配置)
二、本地vscode鏈接到遠(yuǎn)程服務(wù)器(本地配置過(guò)可跳過(guò))
參考:vscode連接SSH遠(yuǎn)程服務(wù)器(詳細(xì)版)
三、clangd配置
3.1下載clangd
安裝好clangd插件之后只是一個(gè)套殼現(xiàn)在代碼是不能跳轉(zhuǎn)的,需要通過(guò)clangd language的支持來(lái)完成跳轉(zhuǎn),clangd language的下載方式有兩種方法
方式一:
下載好之后任意打開一個(gè)C/CPP文件,vscode下方會(huì)出現(xiàn)彈窗直接install即可(若網(wǎng)絡(luò)原因或其他原因這里一直下載不出來(lái)請(qǐng)參考方式二)
方式二:
從GitHub上下載clangd-language
選擇最新的版本即可,開發(fā)環(huán)境是linux選擇linux即可,博主這里選用的就是linux,其他系統(tǒng)同理。
將下載好的clangd解壓到任意一個(gè)path下,如下
cd /home/zly/tools/
unzip clangd_16.0.2.zip
在vscode上按住ctrl+,進(jìn)入配置選項(xiàng),如下在clangd中填寫我們下載好的language的path。
3.2配置clangd(重點(diǎn))
clangd準(zhǔn)備工作在上述,雖然已經(jīng)基本完成,但是如果打開工程代碼還是會(huì)發(fā)現(xiàn)代碼還是不能夠任意跳轉(zhuǎn),這是因?yàn)閏langd查詢不到對(duì)應(yīng)的工程頭文件,因此需要生成compile_commands.json,使用compile_commands.json文件來(lái)生成索引文件,這樣當(dāng)我們點(diǎn)擊某個(gè)函數(shù)時(shí)可以飛快跳轉(zhuǎn)到它定義的地方。
compile_commands.json文件中記錄的是每個(gè)文件的編譯選項(xiàng),樣式如下:
{
"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,具體詳細(xì)規(guī)范可以參考clangd說(shuō)明)給clangd傳遞這些參數(shù)。
接下來(lái)通過(guò)kernel以及Android工程來(lái)分別生成compile_commands.json,
一、kernel中生成compile_commands.json
方法a:(注意!進(jìn)行以下操作前需要確保工程提前被編譯過(guò))
kernel中自帶了scripts/clang-tools/gen_compile_commands.py可以直接生成(低內(nèi)核版本沒有該腳本,可以從網(wǎng)上下載一個(gè))
- 編譯一遍kernel
zly@zly-machine:~/work$ ./build.sh kernel
- 通過(guò)find -name "*.cmd"確認(rèn)是否生成
........................................
./kernel/arch/arm/lib/.memchr.o.cmd
./kernel/arch/arm/lib/.lib1funcs.o.cmd
./kernel/arch/arm/lib/.call_with_stack.o.cmd
........................................
- 執(zhí)行g(shù)en_compile_commands.py在當(dāng)前目錄下生成compile_commands.json
zly@zly-machine:~/work/kernel$ python3 ./scripts/clang-tools/gen_compile_commands.py
- cp compile_commands.json到kernel目錄下
方法b:(注意工程要沒有編譯過(guò)!若編譯過(guò)make clean一下)
通過(guò)使用bear來(lái)生成:Bear 是一個(gè)用于生成編譯器的工具,它可以將編譯器前端的源代碼轉(zhuǎn)換成抽象語(yǔ)法樹(AST)并輸出到一個(gè)JSON文件中。
- 安裝bear
zly@zly-machine:~$ sudo apt-get install bear
- 使用bear命令來(lái)生成compile_commands.json
用法如下:
bear make [其他make本身的參數(shù)]
它會(huì)記錄make過(guò)程編譯文件時(shí)用到的命令。
所以我們編譯內(nèi)核的目的是生成compile_commands.json,執(zhí)行如下命令:
zly@zly-machine:~/work$ bear ./build.sh kernel
同樣會(huì)生成compile_commands.json,將該json,cp到我們對(duì)應(yīng)的工程下即可。
二、Android中生成compile_commands.json
安卓和kernel其實(shí)是同理的,但是安卓工程更加龐大,在安卓7之后基本工程直接使用ninja來(lái)進(jìn)行編譯構(gòu)建的,因此我們可以直接通過(guò)ninjia快速構(gòu)建同步生成對(duì)應(yīng)的compile_commands.json.
ninja提供了一個(gè)工具(-t commands)可以生成特點(diǎn)目標(biāo)的編譯命令:
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生成好并且放到相關(guān)工程中即可,正式使用了,使用前,在vscode重啟下clangd:ctrl+shift+p
之后就可以實(shí)現(xiàn)代碼的任意跳轉(zhuǎn)了~,clangd功能十分強(qiáng)大!不單單只有代碼跳轉(zhuǎn)那么簡(jiǎn)單,還可以為代碼提供補(bǔ)全、錯(cuò)誤提示、跳轉(zhuǎn)、導(dǎo)航等功能。
四、clangd簡(jiǎn)介
clangd是一個(gè)C/C++語(yǔ)言的基于LSP的語(yǔ)言服務(wù)實(shí)現(xiàn),可以為代碼提供補(bǔ)全、錯(cuò)誤提示、跳轉(zhuǎn)、導(dǎo)航等功能。
1.代碼補(bǔ)全、跳轉(zhuǎn)、導(dǎo)航、查看引用、查看實(shí)現(xiàn)
代碼補(bǔ)全:
轉(zhuǎn)到定義、引用、實(shí)現(xiàn):
快速定位:(ctrl+shift+o、ctrl+T)
2.錯(cuò)誤提示、靜態(tài)檢查
錯(cuò)誤提示:
靜態(tài)檢查:快速修復(fù)
3.格式化代碼
對(duì)整個(gè)文件(Shitft+Alt+F),選中區(qū)域格式化(Ctrl+K Ctrl+F)文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-674427.html
4.重構(gòu)
5.懸浮提示
按住ctrl+左鍵即可跳躍到對(duì)應(yīng)函數(shù)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-674427.html
到了這里,關(guān)于【vscode基于clangd實(shí)現(xiàn)Android/Linux代碼跳轉(zhuǎn)】的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!