前言
最初在使用Linux內(nèi)核源碼進(jìn)行驅(qū)動(dòng)開(kāi)發(fā)時(shí),由于沒(méi)有代碼補(bǔ)全、自動(dòng)提示等功能寫起來(lái)十分不方便,雖然有人使用Source Insight來(lái)閱讀源碼,但是我用起來(lái)還是感覺(jué)怪怪的,有時(shí)間同一個(gè)函數(shù)會(huì)找到很多的定義,不便判斷。在調(diào)用層次方面,還是clangd更好用。
一、VSCode安裝clangd插件并搭建環(huán)境
Clangd 是一個(gè)基于 Clang 的語(yǔ)言服務(wù)器,它提供了代碼智能感知和導(dǎo)航功能。通過(guò)與 VSCode 集成,可以實(shí)現(xiàn)以下功能:
- 代碼補(bǔ)全和自動(dòng)提示:Clangd 可以根據(jù)代碼上下文提供準(zhǔn)確的補(bǔ)全建議和自動(dòng)提示,幫助開(kāi)發(fā)者快速編寫代碼。
- 代碼跳轉(zhuǎn)和導(dǎo)航:Clangd 可以識(shí)別代碼中的符號(hào)引用、函數(shù)調(diào)用等,并支持跳轉(zhuǎn)到定義、查看聲明等操作,便于閱讀和理解復(fù)雜的內(nèi)核源代碼。
- 實(shí)時(shí)錯(cuò)誤和警告檢查:Clangd 可以實(shí)時(shí)檢查代碼中的語(yǔ)法錯(cuò)誤、潛在問(wèn)題和警告信息,幫助開(kāi)發(fā)者及早發(fā)現(xiàn)和修復(fù)問(wèn)題。
- 重構(gòu)支持:Clangd 提供了一些重構(gòu)功能,如重命名變量、提取函數(shù)等,可以簡(jiǎn)化代碼重構(gòu)的過(guò)程。
1、安裝插件
2、禁用或卸載Microsoft C/C++ Intelligence
因?yàn)楹蚦langd有沖突,這種語(yǔ)法高亮的插件往往只能二者存其一。
3、安裝clangd安裝包
VSCode clangd插件本身是不能運(yùn)行的,它還需要clangd的環(huán)境,所以接下來(lái)安裝clangd。
下載地址
在Ubuntu中最好不要使用apt安裝,因?yàn)榘姹颈容^舊,建議下載后手動(dòng)安裝。
解壓后,
將bin文件夾下的 clangd 移動(dòng)到 /usr/bin 目錄下,
將lib文件夾下的所有移動(dòng)到 /usr/local/lib 目錄下。
之后打開(kāi)終端,鍵入:
clangd --version
就算成功。
4、修改拓展設(shè)置
修改正確clangd路徑:
二、使用bear構(gòu)建源碼的 compile_commands.json文件
如果沒(méi)有bear的話就安裝一下:
sudo apt install bear
我使用的是韋東山的imx6ull-qemu模擬開(kāi)發(fā)板的內(nèi)核源碼,內(nèi)核編譯命令如下:
ml@ml-virtual-machine:~$ cd linux-4.9.88
ml@ml-virtual-machine:~$ make mrproper
ml@ml-virtual-machine:~$ make 100ask_imx6ull_qemu_defconfig
ml@ml-virtual-machine:~$ bear make zImage -j4 //編譯zImage 內(nèi)核
ml@ml-virtual-machine:~$ make clean // 清除生成文件
倒數(shù)第二條帶有bear的指令就是生成compile_commands.json文件的。
compile_commands.json文件記錄了你的工程是如何構(gòu)建的,使用到了哪些源碼文件,源碼文件之間的包含關(guān)系,引用路徑之類的,這些可以幫助clangd構(gòu)建符號(hào)關(guān)系索引庫(kù)。
三、修改compile_commands.json文件
目前,這個(gè)文件還不能用,需要修改編譯工具鏈成對(duì)應(yīng)的工具鏈,比如我這里需要全局替換:
"cc" --> "arm-linux-gnueabihf-gcc"
保存后關(guān)閉VSCode,如果有.cache文件夾的話,刪除掉它。之后重新用VSCode打開(kāi)源碼目錄,隨便打開(kāi)一個(gè).c文件,clangd便自動(dòng)開(kāi)始索引文件了,索引文件會(huì)保存在 .cache 目錄下。
如果這個(gè)過(guò)程特別快,只有幾秒鐘的話,那就是上述步驟有錯(cuò)誤。正常來(lái)說(shuō),這個(gè)索引過(guò)程會(huì)有幾分鐘。
四、驅(qū)動(dòng)程序和應(yīng)用程序的編寫
對(duì)于驅(qū)動(dòng)程序來(lái)說(shuō),我的方法是在當(dāng)前源碼目錄下新建一個(gè)文件夾,在這個(gè)文件夾下進(jìn)行驅(qū)動(dòng)程序的編寫,這樣跳轉(zhuǎn)、補(bǔ)全之類的都比較方便。
然后保存工作區(qū),方便下次打開(kāi):
對(duì)應(yīng)用程序來(lái)說(shuō),不便放在源碼工作區(qū)當(dāng)中,可以像這樣單獨(dú)打開(kāi)一個(gè)用于編寫應(yīng)用程序:
驅(qū)動(dòng)程序?qū)懲旰?,拷貝到?yīng)用程序所在目錄的驅(qū)動(dòng)程序文件中。
此后,便可以方便快捷的編寫驅(qū)動(dòng)程序和應(yīng)用程序了。
五、配置文件的添加
clangd 是集成了 clang-tidy 和 clang-format 的,所以二者的配置文件也能在clangd下面使用。比如,我根據(jù)我的喜好更改了 format 格式和它的函數(shù)參數(shù)提示。
.clangd 文件
# 提示嵌入,不使用函數(shù)參數(shù)嵌入提示
InlayHints:
Designators: Yes
Enabled: Yes
ParameterNames: No
DeducedTypes: Yes
CompileFlags:
Add: [-xc, -Wall]
.clang-format 文件
BasedOnStyle: LLVM
UseTab: Never
IndentWidth: 4
TabWidth: 4
# 最外層大括號(hào)換行
# BreakBeforeBraces: Linux
BreakBeforeBraces: Allman
AllowShortIfStatementsOnASingleLine: true
IndentCaseLabels: false
ColumnLimit: 120
六、其它(可選)
如果你已經(jīng)配置完成,就不要在意這里的設(shè)置。
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-793003.html
參考
使用VSCode clangd插件進(jìn)行l(wèi)inux內(nèi)核代碼閱讀和嵌入式開(kāi)發(fā)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-793003.html
到了這里,關(guān)于VSCode使用clangd構(gòu)建Linux驅(qū)動(dòng)開(kāi)發(fā)環(huán)境的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!