本章記錄下我針對(duì) nanogui 寫(xiě)的 videoview 控件,并且在海康的一個(gè)攝像頭上測(cè)試通過(guò)的過(guò)程,在開(kāi)發(fā)的過(guò)程中碰到了 segment fault的問(wèn)題,通過(guò)導(dǎo)出 core 文件以及使用 gdb 很快定位出崩潰的原因,在這個(gè)過(guò)程中再次體驗(yàn)到了使用 buildroot 進(jìn)行構(gòu)建的快樂(lè)。但是我目前根據(jù) nanogui 開(kāi)發(fā)的程序尚未繼承到 buildroot 當(dāng)中,將 nanogui 繼承到 buildroot 這個(gè)也算是后期的一個(gè)目標(biāo)。
- 修復(fù)ffmpeg編譯一直出錯(cuò),提示undefined av_xxxx
- 使用 buildroot 編譯 aarch64-linux-gdb定位 segment fault 問(wèn)題
- 在 solus 上編譯 buildroot,修復(fù)相關(guān)編譯錯(cuò)誤
1. 鏈接 ffmpeg 庫(kù)一直出錯(cuò)
首先看一下出錯(cuò)的提示:
后來(lái)參考了網(wǎng)上的解決方案,發(fā)現(xiàn)是引用 ffmpeg 頭文件的時(shí)候缺少
#ifdef __cplusplus
extern "C" {
#endif
xxxxx /* ffmpeg 頭文件 */
#ifdef __cplusplus
}
#endif
因?yàn)?ffmpeg 主要是 c 語(yǔ)言開(kāi)發(fā)的所以,引用相關(guān)頭文件的時(shí)候需要為 C++ 原文件進(jìn)行一次兼容。要不然的話,就不能正常引用到對(duì)應(yīng)的函數(shù)。
完整 videoview 控件的源碼,我已經(jīng)上傳到我 fork 的 nanogui 倉(cāng)庫(kù)了。這里就不羅列了,這里展示下成功顯示視頻的相關(guān)照片:
2. 使用 gdb 定位 segment fault
在順利完成 ffmpeg 的鏈接編譯之后,開(kāi)始運(yùn)行可執(zhí)行程序,發(fā)現(xiàn) segment fault了,我嘗試使用 gdbserver 和 gdb 配置進(jìn)行定位,發(fā)現(xiàn)默認(rèn)并沒(méi)有編譯出來(lái) aarch64-linux-gdb。只能在 buildroot 中開(kāi)啟 host gdb 的編譯,主要放開(kāi)如下宏:
BR2_PACKAGE_HOST_GDB=y
BR2_PACKAGE_HOST_GDB_TUI=y
BR2_GDB_VERSION_8_1=y
BR2_GDB_VERSION="8.1.1"
編譯出來(lái)后,在板子上修改 core 配置,放開(kāi)生成 core 文件:ulimit -c unlimited
。然后將 core 文件發(fā)送到 PC,再使用命令 aarch64-linux-gdb example1 core
對(duì) example1進(jìn)行調(diào)試(目前我的開(kāi)發(fā)是直接修改的 example1.cpp進(jìn)行的)。記得修改下 sysroot 和 solib-search,這部分可以放在當(dāng)前目錄的 .gdbinit 文件中:
set solib-search-path /home/yangyongsheng/Projects/debian_yy3568/YY3568-Debian10/buildroot/output/rockchip_rk3568/host/aarch64-buildroot-linux-gnu/sysroot/
set sysroot ~/Projects/debian_yy3568/YY3568-Debian10/buildroot/output/rockchip_rk3568/host/aarch64-buildroot-linux-gnu/sysroot/
記得還有修改下 ~/.gdbinit 文件:
set auto-load safe-path /
通過(guò) gdb 很快就可以定位到出錯(cuò)的代碼位置。
3. 在 solus 上編譯 buildroot
家里的一臺(tái)筆記本,我安裝的是 solus,軟件包可能沒(méi)有 fedora 那么齊全,所以編譯過(guò)程中碰到了一些問(wèn)題,經(jīng)過(guò)幾天的搜索還好是順利將 buildroot編譯通過(guò),通過(guò)這幾天的排查問(wèn)題,我感覺(jué)的 solus 依舊好用。有些軟件包官方倉(cāng)庫(kù)沒(méi)有就需要自己手動(dòng)下載源碼安裝,我僅羅列一些我下載的:
├── libdb
├── libnsl
├── libtirpc
├── libxcrypt
特別地在編譯 python2.7 的時(shí)候,總是出錯(cuò),但是終端提示的問(wèn)題只是一些警告信息,導(dǎo)致我一直搜索如何排除這些警告,實(shí)際還是走了一些彎路。可能是 unbuffer
的鍋,因?yàn)槲以谑褂?buildroot menuconfig 的時(shí)候使用默認(rèn)的 unbuffer
總是無(wú)法在 solus 上彈出來(lái) menuconfig 的配置界面(因?yàn)槲乙_(kāi)啟 gdb 編譯選項(xiàng)),在 buildroot 的根目錄直接 make menuconfig 確是可以的,后來(lái)我就強(qiáng)制修改 menuconfig 的時(shí)候不用 brmake 而是使用 make 規(guī)避了這個(gè)問(wèn)題。下次碰到這個(gè)問(wèn)題需要去對(duì)應(yīng)的 buildroot 的根目錄去 make 確認(rèn)出錯(cuò)的根本原因,發(fā)現(xiàn)是鏈接 crypt 的時(shí)候出錯(cuò)的,通過(guò)強(qiáng)制創(chuàng)建 /lib/libcrypt.so 到的軟鏈接修復(fù)了這個(gè)問(wèn)題。
? ll /lib/libcrypt.so
lrwxrwxrwx root root 26 B Sun Aug 13 13:44:40 2023 ? /lib/libcrypt.so ? /usr/local/lib/libcrypt.so
再展示下在 solus 下使用 buildroot 開(kāi)心編譯的截圖:
通過(guò)這個(gè)過(guò)程我還發(fā)現(xiàn)了一個(gè)軟件包集合的網(wǎng)站 https://dev.getsol.us/source,這里面包含了 solus 有關(guān) python2.7 的配置編譯依賴,最后順利編譯出來(lái)了 buildroot 選擇的 python2.7。
審核編輯:湯梓紅
-
Linux
+關(guān)注
關(guān)注
87文章
11345瀏覽量
210378 -
C++
+關(guān)注
關(guān)注
22文章
2114瀏覽量
73854 -
開(kāi)發(fā)板
+關(guān)注
關(guān)注
25文章
5121瀏覽量
98187 -
編譯
+關(guān)注
關(guān)注
0文章
661瀏覽量
33040 -
RK3568
+關(guān)注
關(guān)注
4文章
525瀏覽量
5232
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論