移植应用到yocto sdk
1. yocto sdk 安装
-
sdk 包解压
tar -xf sdk.tar
-
sdk 安装
cd sdk ./poky-glibc-x86_64-xxx-full-aarch64-toolchain-2.5.sh
具体如下图:
-
安装完成后进行环境变量配置:
cd xxx/xxx/sdk/sumo/ ls source environment-setup-aarch64-poky-linux aarch64-poky-linux-gcc -v
配置完成后上述命令可以看到相关路径信息则说明配置成功,如下图
2. ffmpeg 编译安装
-
修改原始的build脚本,将其中的环境变量标记为当前sdk中环境目录
-
对应的gcc需要修改为sdk中实际使用的交叉编译工具
-
将ffmpeg生成项添加到sdk目录中,在编译app时使用
rsync -alP ./* ../../../sumo/sysroots/x86_64-pokysdk-linux/usr/ rsync -alP ./* ../../../sumo/sysroots/aarch64-poky-linux/usr/
注意这里有个问题,现在是手动的将so和链接文件sync到了sdk中,但是实际target中的是没有这些so的,所以需要后续安装一下子;
注意,上述为arm版本实际编译使用,在x86版本的话则直接安装对应ffmpeg相关库即可;
3. 编译应用
3.1 ARM 版本编译
-
编译指令为make arm_test
-
由于原来在buildroot编译源码中添加的这个app,所以没有按照标准导出sdk的方式进行使用,而是直接指定了源码toolchain路径,所以这部分信息需要配置
-
基于yocto 导出sdk的情况下:
-
drm相关文件路径需要指定:
INCLUDE_BASE_ARM=-I${ARM_SDK_PATH}/aarch64-poky-linux/usr/include/drm
-
window 窗口依赖需要指定defined:
ARM_HOST= -D __GBM__
-
freetype2依赖路径需要指定:
INCLUDE_FREETYPE_ARM=-I${ARM_SDK_PATH}/aarch64-poky-linux/usr/include/freetype2
修改上述部分后可以直接编译通过;
-
3.2 x86版本
-
安装ffmpeg相关库:libav系列
sudo apt-cache search xxx sudo apt install xxx xxx = libavutil-dev libavcodec-dev libavformat-dev libswscale-dev libavfilter-dev libavdevice-dev zlib1g-dev
-
安装freetype2
源码网址:https://download.savannah.gnu.org/releases/freetype/
下载完成后解压编译一条龙:
tar -xf freetype-2.19.tar.gz cd freetype-2.19 ./configure --prefix=/usr make -j sudo make install
注意上述需要指定安装路径,否则install完成后没有安装到系统usr中
-
编译程序
make x86_test
4. 问题记录
4.1 real-ld 链接 crt*.o 失败
-
确认 sdk中是否存在上述文件
find ./ -name "crt*o"
./sysroots/aarch64-poky-linux/usr/lib/crtn.o
./sysroots/aarch64-poky-linux/usr/lib/crt1.o
./sysroots/aarch64-poky-linux/usr/lib/arm-pokymllib32-linux-gnueabi/7.3.0/crtendS.o
./sysroots/aarch64-poky-linux/usr/lib/crti.o
./sysroots/aarch64-poky-linux/usr/lib64/crtn.o
./sysroots/aarch64-poky-linux/usr/lib64/aarch64-poky-linux/7.3.0/crtend.o说明sdk中存在上述文件;
-
确认编译时的搜索目录:
aarch64-poky-linux-gcc -print-search-dirs
上图中可以看到,与sdk中的目录不同,即需要将上述目录加进去,或者将上述文件添加到已经search的目录中
-
根据configure参数和sdk中environment 配置项重新构建编译选项
配置成上述参数后可以编译完成