本章记录下我针对 nanogui 写的 videoview 控件,并且在海康的一个摄像头上测试通过的过程,在开发的过程中碰到了 segment fault的问题,通过导出 core 文件以及使用 gdb 很快定位出崩溃的原因,在这个过程中再次体验到了使用 buildroot 进行构建的快乐。但是我目前根据 nanogui 开发的程序尚未继承到 buildroot 当中,将 nanogui 继承到 buildroot 这个也算是后期的一个目标。
- 修复ffmpeg编译一直出错,提示undefined av_xxxx
- 使用 buildroot 编译 aarch64-linux-gdb定位 segment fault 问题
- 在 solus 上编译 buildroot,修复相关编译错误
1. 链接 ffmpeg 库一直出错
首先看一下出错的提示:
![l_ffmpeg_undef.png](//file1.elecfans.com/web2/M00/90/B6/wKgaomTcaEGAE9ChAAK7gyXTBHU516.png)
后来参考了网上的解决方案,发现是引用 ffmpeg 头文件的时候缺少
#ifdef __cplusplus
extern "C" {
#endif
xxxxx
#ifdef __cplusplus
}
#endif
因为 ffmpeg 主要是 c 语言开发的所以,引用相关头文件的时候需要为 C++ 原文件进行一次兼容。要不然的话,就不能正常引用到对应的函数。
完整 videoview 控件的源码,我已经上传到我 fork 的 nanogui 仓库了。这里就不罗列了,这里展示下成功显示视频的相关照片:
![00.jpg](//file1.elecfans.com/web2/M00/90/B6/wKgaomTcaFCAM2dGAAMHzzqIzew070.jpg)
![11.jpg](//file1.elecfans.com/web2/M00/90/B2/wKgZomTcaFiAQ0w7AAdukD6Grvs359.jpg)
2. 使用 gdb 定位 segment fault
在顺利完成 ffmpeg 的链接编译之后,开始运行可执行程序,发现 segment fault了,我尝试使用 gdbserver 和 gdb 配置进行定位,发现默认并没有编译出来 aarch64-linux-gdb。只能在 buildroot 中开启 host gdb 的编译,主要放开如下宏:
BR2_PACKAGE_HOST_GDB=y
BR2_PACKAGE_HOST_GDB_TUI=y
BR2_GDB_VERSION_8_1=y
BR2_GDB_VERSION="8.1.1"
编译出来后,在板子上修改 core 配置,放开生成 core 文件:ulimit -c unlimited
。然后将 core 文件发送到 PC,再使用命令 aarch64-linux-gdb example1 core
对 example1进行调试(目前我的开发是直接修改的 example1.cpp进行的)。记得修改下 sysroot 和 solib-search,这部分可以放在当前目录的 .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 /
通过 gdb 很快就可以定位到出错的代码位置。
3. 在 solus 上编译 buildroot
家里的一台笔记本,我安装的是 solus,软件包可能没有 fedora 那么齐全,所以编译过程中碰到了一些问题,经过几天的搜索还好是顺利将 buildroot编译通过,通过这几天的排查问题,我感觉的 solus 依旧好用。有些软件包官方仓库没有就需要自己手动下载源码安装,我仅罗列一些我下载的:
├── libdb
├── libnsl
├── libtirpc
├── libxcrypt
特别地在编译 python2.7 的时候,总是出错,但是终端提示的问题只是一些警告信息,导致我一直搜索如何排除这些警告,实际还是走了一些弯路。可能是 unbuffer
的锅,因为我在使用 buildroot menuconfig 的时候使用默认的 unbuffer
总是无法在 solus 上弹出来 menuconfig 的配置界面(因为我要开启 gdb 编译选项),在 buildroot 的根目录直接 make menuconfig 确是可以的,后来我就强制修改 menuconfig 的时候不用 brmake 而是使用 make 规避了这个问题。下次碰到这个问题需要去对应的 buildroot 的根目录去 make 确认出错的根本原因,发现是链接 crypt 的时候出错的,通过强制创建 /lib/libcrypt.so 到的软链接修复了这个问题。
▸ 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 开心编译的截图:
![buildroot_solus.png](//file1.elecfans.com/web2/M00/90/B2/wKgZomTcaLqADHrWAABtytkbfiE999.png)
通过这个过程我还发现了一个软件包集合的网站 https://dev.getsol.us/source,这里面包含了 solus 有关 python2.7 的配置编译依赖,最后顺利编译出来了 buildroot 选择的 python2.7。