Ubuntu系统下交叉编译gpac

一、参考资料

瑞芯微RK1126平台编译zlib gpac 使用GPAC将H264 H265保存为MP4文件录像_专栏_易百纳技术社区

二、准备工作

1. 编译环境

  • 宿主机:Ubuntu 20.04.6 LTS
  • Host:ARM64位,海思开发板
  • 交叉编译器:aarch64-mix210-linux-gcc-7.3.0

2. 设置交叉编译工具链

在交叉编译之前,需要设置交叉编译工具链的环境变量。

bash 复制代码
export PATH=/path/to/toolchains/aarch64-mix210-linux/bin:$PATH

3. 交叉编译zlib

注意:由于gpac依赖zlib库,在编译 gpac之前,需要先编译好zlib库。

详细步骤,请参考另一篇博客:Ubuntu系统下交叉编译zlib-CSDN博客

三、交叉编译gpac

1. 下载源码

github地址:GitHub - gpac/gpac

Download GPAC - gpac.io

下载并解压源码。

bash 复制代码
git clone https://github.com/gpac/gpac.git
cd gpac
mkdir aarch64_install

2. 设置环境变量

设置交叉编译工具链的环境变量:

bash 复制代码
export PATH=/home/yoyo/360Downloads/toolchains/aarch64-mix210-linux/bin:$PATH

3. 生成configure配置

bash 复制代码
./configure --prefix=/media/sda3/360Downloads/gpac/aarch64_install \
--cc=aarch64-mix210-linux-gcc --cxx=aarch64-mix210-linux-g++ \
--extra-cflags="-fPIC -I/media/sda3/360Downloads/zlib-1.3.1/aarch64_install/include"  \
--extra-ldflags="-L/media/sda3/360Downloads/zlib-1.3.1/aarch64_install/lib -lz" \
--use-zlib=local

输出示例:

bash 复制代码
yoyo@yoyo:/media/sda3/360Downloads/gpac$ ./configure --prefix=/media/sda3/360Downloads/gpac/aarch64_install \
> --cc=aarch64-mix210-linux-gcc --cxx=aarch64-mix210-linux-g++ \
> --extra-cflags="-fPIC -I/media/sda3/360Downloads/zlib-1.3.1/aarch64_install/include"  \
> --extra-ldflags="-L/media/sda3/360Downloads/zlib-1.3.1/aarch64_install/lib -lz" \
> --use-zlib=local
/tmp/gpac-conf--87007-.o: error while loading shared libraries: libz.so.1: cannot open shared object file: No such file or directory

** System Configuration
Install prefix: /media/sda3/360Downloads/gpac/aarch64_install
Source path: /media/sda3/360Downloads/gpac
C   compiler: aarch64-mix210-linux-gcc
C++ compiler: aarch64-mix210-linux-g++
make: make
CPU: x86
Big Endian: no

** GPAC 26.03-DEV rev350-gc2dee3aff-master Core Configuration **
Unit Tests: no ('make unit_tests')
Static Modules: no
max stack size: 32768
debug version: no
GProf enabled: no
Memory tracking enabled: no
Sanitizer enabled: no
Fixed-Point Version: no
IPV6 Support: yes
QuickJS Support: yes (with qjs-libc)

** Detected libraries **
zlib: local
OpenGL support: no
OpenSSL support: no
nghttp2: no
ngtcp2: no
nghttp3: no
OSS Audio: system
ALSA Audio: no
Jack Audio: no
Pulse Audio: no
DirectFB: no
X11: no
SDL: no
DVB for Linux: system
FreeType: no
JPEG: no
OpenJPEG: no
PNG: no
MAD: no
FAAD: no
XVID: no
libcaption: no
MpeghDecoder: no
libcaca: no
libcurl: no
FFmpeg: no
LZMA: no
Xiph Vorbis: no
Xiph Theora: no
A52 (AC3): no
OpenSVCDecoder: no
OpenHEVCDecoder: no
Platinum UPnP: no
Freenect: no

Creating config.mak
Check config.log for detection failures
Done - type 'make help' for make info, 'make' to build

4. 编译安装

bash 复制代码
# 编译
make -j8

# 安装
make install

make 编译:

bash 复制代码
...
make[2]: Leaving directory '/media/sda3/360Downloads/gpac/applications/gpac'
make[2]: Entering directory '/media/sda3/360Downloads/gpac/applications/mp4box'
  CC mp4box.c
  CC filedump.c
  CC fileimport.c
  CC live.c
make[2]: Leaving directory '/media/sda3/360Downloads/gpac/applications/mp4box'
make[1]: Leaving directory '/media/sda3/360Downloads/gpac/applications'
make -C modules all
make[1]: Entering directory '/media/sda3/360Downloads/gpac/modules'
set -e; for i in validator ; do make -C $i all; done
make[2]: Entering directory '/media/sda3/360Downloads/gpac/modules/validator'
  CC validator.c
validator.c: In function 'validator_create_snapshot':
validator.c:155:90: warning: pointer targets in passing argument 6 of 'gf_img_png_enc' differ in signedness [-Wpointer-sign]
 nc(fb.video_buffer, fb.width, fb.height, fb.pitch_y, fb.pixel_format, dst, &dst_size);
                                                                       ^~~
In file included from /media/sda3/360Downloads/gpac/include/gpac/media_tools.h:39:0,
                 from /media/sda3/360Downloads/gpac/include/gpac/internal/media_dev.h:30,
                 from validator.c:29:
/media/sda3/360Downloads/gpac/include/gpac/avparse.h:849:8: note: expected 'u8 * {aka unsigned char *}' but argument is of type 'char *'
 GF_Err gf_img_png_enc(u8 *data, u32 width, u32 height, s32 stride, u32 pixel_format, u8 *dst, u32 *dst_size);
        ^~~~~~~~~~~~~~
make[2]: Leaving directory '/media/sda3/360Downloads/gpac/modules/validator'
make[1]: Leaving directory '/media/sda3/360Downloads/gpac/modules'

make install 安装:

bash 复制代码
yoyo@yoyo:/media/sda3/360Downloads/gpac$ make install
install -d "/media/sda3/360Downloads/gpac/aarch64_install"
make install-lib
make[1]: Entering directory '/media/sda3/360Downloads/gpac'
install -d "/media/sda3/360Downloads/gpac/aarch64_install/include/gpac"
install -d "/media/sda3/360Downloads/gpac/aarch64_install/include/gpac/internal"
install -d "/media/sda3/360Downloads/gpac/aarch64_install/include/gpac/modules"
install  -m 644 /media/sda3/360Downloads/gpac/include/gpac/*.h "/media/sda3/360Downloads/gpac/aarch64_install/include/gpac"
install  -m 644 /media/sda3/360Downloads/gpac/include/gpac/internal/*.h "/media/sda3/360Downloads/gpac/aarch64_install/include/gpac/internal"
install  -m 644 /media/sda3/360Downloads/gpac/include/gpac/modules/*.h "/media/sda3/360Downloads/gpac/aarch64_install/include/gpac/modules"
install  -m 644 config.h "/media/sda3/360Downloads/gpac/aarch64_install/include/gpac/configuration.h" || true
install -d "/media/sda3/360Downloads/gpac/aarch64_install/lib"
install  -m 644 "./bin/gcc/libgpac_static.a" "/media/sda3/360Downloads/gpac/aarch64_install/lib" || true
install -d /media/sda3/360Downloads/gpac/aarch64_install/lib/pkgconfig
install  -m 644 gpac.pc "/media/sda3/360Downloads/gpac/aarch64_install/lib/pkgconfig"
make installdylib
make[2]: Entering directory '/media/sda3/360Downloads/gpac'
install -d "/media/sda3/360Downloads/gpac/aarch64_install/lib"
install  -m 755 bin/gcc/libgpac.so.16.17.0 /media/sda3/360Downloads/gpac/aarch64_install/lib/libgpac.so.16.17.0
ln -sf libgpac.so.16.17.0 /media/sda3/360Downloads/gpac/aarch64_install/lib/libgpac.so.16
ln -sf libgpac.so.16.17.0 /media/sda3/360Downloads/gpac/aarch64_install/lib/libgpac.so
ldconfig || true
/sbin/ldconfig.real: Can't create temporary cache file /etc/ld.so.cache~: Permission denied
make[2]: Leaving directory '/media/sda3/360Downloads/gpac'
make[1]: Leaving directory '/media/sda3/360Downloads/gpac'
install -d "/media/sda3/360Downloads/gpac/aarch64_install/bin"
if [ -f bin/gcc/MP4Box ] ; then \
install  -m 755 bin/gcc/gpac "/media/sda3/360Downloads/gpac/aarch64_install/bin" ; \
fi
if [ -f bin/gcc/MP4Box ] ; then \
install  -m 755 bin/gcc/MP4Box "/media/sda3/360Downloads/gpac/aarch64_install/bin" ; \
fi
install -d "/media/sda3/360Downloads/gpac/aarch64_install/lib/gpac"
install bin/gcc/gm_*.so "/media/sda3/360Downloads/gpac/aarch64_install/lib/gpac" || true
install bin/gcc/gf_*.so "/media/sda3/360Downloads/gpac/aarch64_install/lib/gpac" || true
install: cannot stat 'bin/gcc/gf_*.so': No such file or directory
install -d "/media/sda3/360Downloads/gpac/aarch64_install/share/man"
install -d "/media/sda3/360Downloads/gpac/aarch64_install/share/man/man1"
install  -m 644 /media/sda3/360Downloads/gpac/share/doc/man/mp4box.1 /media/sda3/360Downloads/gpac/aarch64_install/share/man/man1/
install  -m 644 /media/sda3/360Downloads/gpac/share/doc/man/gpac.1 /media/sda3/360Downloads/gpac/aarch64_install/share/man/man1/
install  -m 644 /media/sda3/360Downloads/gpac/share/doc/man/gpac-filters.1 /media/sda3/360Downloads/gpac/aarch64_install/share/man/man1/
install -d "/media/sda3/360Downloads/gpac/aarch64_install/share/gpac"
install -d "/media/sda3/360Downloads/gpac/aarch64_install/share/gpac/res"
install -d "/media/sda3/360Downloads/gpac/aarch64_install/share/gpac/gui"
install -d "/media/sda3/360Downloads/gpac/aarch64_install/share/gpac/gui/icons"
install -d "/media/sda3/360Downloads/gpac/aarch64_install/share/gpac/gui/extensions"
install -d "/media/sda3/360Downloads/gpac/aarch64_install/share/gpac/shaders"
install -d "/media/sda3/360Downloads/gpac/aarch64_install/share/gpac/scripts"
install -d "/media/sda3/360Downloads/gpac/aarch64_install/share/gpac/python"
install -d "/media/sda3/360Downloads/gpac/aarch64_install/share/gpac/rmtws"
install  -m 644 /media/sda3/360Downloads/gpac/share/default.cfg /media/sda3/360Downloads/gpac/aarch64_install/share/gpac/
install -d "/media/sda3/360Downloads/gpac/aarch64_install/share/icons/hicolor/128x128/apps"
install -d "/media/sda3/360Downloads/gpac/aarch64_install/share/applications"
install  -m 644 /media/sda3/360Downloads/gpac/share/res/gpac.png "/media/sda3/360Downloads/gpac/aarch64_install/share/icons/hicolor/128x128/apps/"
install  -m 644 /media/sda3/360Downloads/gpac/share/gpac.desktop "/media/sda3/360Downloads/gpac/aarch64_install/share/applications/"
install  -m 644 /media/sda3/360Downloads/gpac/share/gui/gui.bt "/media/sda3/360Downloads/gpac/aarch64_install/share/gpac/gui/"
install  -m 644 /media/sda3/360Downloads/gpac/share/gui/gui.js "/media/sda3/360Downloads/gpac/aarch64_install/share/gpac/gui/"
install  -m 644 /media/sda3/360Downloads/gpac/share/gui/gwlib.js "/media/sda3/360Downloads/gpac/aarch64_install/share/gpac/gui/"
cp --no-preserve=mode,ownership,timestamp /media/sda3/360Downloads/gpac/share/gui/icons/* /media/sda3/360Downloads/gpac/aarch64_install/share/gpac/gui/icons/
cp -R --no-preserve=mode,ownership,timestamp /media/sda3/360Downloads/gpac/share/gui/extensions/* /media/sda3/360Downloads/gpac/aarch64_install/share/gpac/gui/extensions/
cp --no-preserve=mode,ownership,timestamp /media/sda3/360Downloads/gpac/share/shaders/* /media/sda3/360Downloads/gpac/aarch64_install/share/gpac/shaders/
cp -R --no-preserve=mode,ownership,timestamp /media/sda3/360Downloads/gpac/share/scripts/* /media/sda3/360Downloads/gpac/aarch64_install/share/gpac/scripts/
cp -R --no-preserve=mode,ownership,timestamp /media/sda3/360Downloads/gpac/share/python/* /media/sda3/360Downloads/gpac/aarch64_install/share/gpac/python/
cp --no-preserve=mode,ownership,timestamp /media/sda3/360Downloads/gpac/share/res/* /media/sda3/360Downloads/gpac/aarch64_install/share/gpac/res/
cp -R --no-preserve=mode,ownership,timestamp /media/sda3/360Downloads/gpac/share/rmtws/* /media/sda3/360Downloads/gpac/aarch64_install/share/gpac/rmtws/

5. 移植到开发板

将编译好的文件,拷贝到开发板。

bash 复制代码
# 拷贝 include
cp -r ./aarch64_install/include/ /usr/local/gpac/

# 拷贝lib
cp -r ./aarch64_install/lib/ /usr/local/gpac/

四、FAQ

Q:warning: libz.so.1, needed by ../../bin/gcc/libgpac.so, not found (try using -rpath or -rpath-link)

bash 复制代码
/home/yoyo/360Downloads/toolchains/aarch64-mix210-linux/host_bin/../lib/gcc/aarch64-linux-gnu/7.3.0/../../../../aarch64-linux-gnu/bin/ld: warning: libz.so.1, needed by ../../bin/gcc/libgpac.so, not found (try using -rpath or -rpath-link)

错误原因:生成 configure 配置时,未找到 zlib 依赖库。

解决方法:生成 configure 配置时,指定 zlib 依赖库路径。

bash 复制代码
./configure --prefix=/media/sda3/360Downloads/gpac/aarch64_install \
--cc=aarch64-mix210-linux-gcc --cxx=aarch64-mix210-linux-g++ \
--extra-cflags="-fPIC -I/media/sda3/360Downloads/zlib-1.3.1/aarch64_install/include"  \
--extra-ldflags="-L/media/sda3/360Downloads/zlib-1.3.1/aarch64_install/lib -lz" \
--use-zlib=local

Q:__stack_chk_guard@@GLIBC_2.17 which may bind externally can not be used when making a shared object; recompile with -fPIC

bash 复制代码
/home/yoyo/360Downloads/toolchains/aarch64-mix210-linux/host_bin/../lib/gcc/aarch64-linux-gnu/7.3.0/../../../../aarch64-linux-gnu/bin/ld: utils/bitstream.o: relocation R_AARCH64_ADR_PREL_PG_HI21 against symbol `__stack_chk_guard@@GLIBC_2.17' which may bind externally can not be used when making a shared object; recompile with -fPIC
/home/yoyo/360Downloads/toolchains/aarch64-mix210-linux/host_bin/../lib/gcc/aarch64-linux-gnu/7.3.0/../../../../aarch64-linux-gnu/bin/ld: utils/bitstream.o(.text+0x444): unresolvable R_AARCH64_ADR_PREL_PG_HI21 relocation against symbol `__stack_chk_guard@@GLIBC_2.17'
/home/yoyo/360Downloads/toolchains/aarch64-mix210-linux/host_bin/../lib/gcc/aarch64-linux-gnu/7.3.0/../../../../aarch64-linux-gnu/bin/ld: final link failed: bad value
collect2: error: ld returned 1 exit status
make[1]: *** [Makefile:412: ../bin/gcc/libgpac.so] Error 1
make[1]: Leaving directory '/media/sda3/360Downloads/gpac/src'
make: *** [Makefile:13: all] Error 2

错误原因 :生成 configure 配置时,未使用 -fPIC

解决方法 :生成 configure 配置时, --extra-cflags 配置项添加 -fPIC

bash 复制代码
--extra-cflags=-I/media/sda3/360Downloads/zlib-1.3.1/aarch64_install/include  \
# 改为
--extra-cflags="-fPIC -I/media/sda3/360Downloads/zlib-1.3.1/aarch64_install/include"  \

Q:error: zlib not found on system or in local libs

bash 复制代码
! Unrecognized option -I/media/sda3/360Downloads/zlib-1.3.1/aarch64_install/include, ignoring !
error: zlib not found on system or in local libs

错误原因 :生成 configure 配置时,--extra-cflags 配置项错误。

解决方法 :修改 --extra-cflags 配置项。

bash 复制代码
--extra-cflags=-fPIC -I/media/sda3/360Downloads/zlib-1.3.1/aarch64_install/include  \
# 改为
--extra-cflags="-fPIC -I/media/sda3/360Downloads/zlib-1.3.1/aarch64_install/include"  \

Q:strip: /xxx/gpac/aarch64_install/include/gpac/xxx.h: file format not recognized

bash 复制代码
yoyo@yoyo:/media/sda3/360Downloads/gpac$ make install
install -d "/media/sda3/360Downloads/gpac/aarch64_install"
make install-lib
make[1]: Entering directory '/media/sda3/360Downloads/gpac'
install -d "/media/sda3/360Downloads/gpac/aarch64_install/include/gpac"
install -d "/media/sda3/360Downloads/gpac/aarch64_install/include/gpac/internal"
install -d "/media/sda3/360Downloads/gpac/aarch64_install/include/gpac/modules"
install -s  -m 644 /media/sda3/360Downloads/gpac/include/gpac/*.h "/media/sda3/360Downloads/gpac/aarch64_install/include/gpac"
strip: /media/sda3/360Downloads/gpac/aarch64_install/include/gpac/00_doxy.h: file format not recognized
install: strip process terminated abnormally
strip: /media/sda3/360Downloads/gpac/aarch64_install/include/gpac/ait.h: file format not recognized
install: strip process terminated abnormally
strip: /media/sda3/360Downloads/gpac/aarch64_install/include/gpac/avparse.h: file format not recognized
install: strip process terminated abnormally
strip: /media/sda3/360Downloads/gpac/aarch64_install/include/gpac/base_coding.h: file format not recognized
...

解决方法 :生成 configure 配置时,不使用 --strip

bash 复制代码
./configure --prefix=/media/sda3/360Downloads/gpac/aarch64_install \
--cc=aarch64-mix210-linux-gcc --cxx=aarch64-mix210-linux-g++ \
--extra-cflags="-fPIC -I/media/sda3/360Downloads/zlib-1.3.1/aarch64_install/include"  \
--extra-ldflags="-L/media/sda3/360Downloads/zlib-1.3.1/aarch64_install/lib -lz" \
--use-zlib=local

Q:strip: Unable to recognise the format of the input file bin/gcc/libgpac.so

bash 复制代码
make installdylib
make[2]: Entering directory '/media/sda3/360Downloads/gpac'
install -d "/media/sda3/360Downloads/gpac/aarch64_install/lib"
strip: Unable to recognise the format of the input file `bin/gcc/libgpac.so'

错误原因strip 架构不一致,默认使用宿主机中的 strip 指令。

解决方法 :修改 config.mak 文件,使用 aarch64-mix210-linux-strip

bash 复制代码
STRIP=@strip
# 修改为
STRIP=@aarch64-mix210-linux-strip

Q:aarch64-mix210-linux/bin/ld: cannot find -lx11

解决方法 :生成 configure 配置时,不使用 x11 相关配置。

bash 复制代码
#--disable-x11 \
#--disable-x11-shm \
#--disable-x11-xv
相关推荐
k4m7v2pz2 天前
交叉编译 Rust 到 aarch64 Linux 掌机:glibc 版本与 sysroot 重建的完整踩坑记录
rust·glibc·交叉编译·aarch64·zigbuild·sysroot
大鹏的NLP博客11 天前
通用 Linux 嵌入式板端 C/C++ ABI 与 Glibc 依赖治理规范
linux·c++·交叉编译
k4m7v2pz15 天前
Rust 程序在 ReactOS 上“加载即崩“:从崩溃地址 0x6107104d 到 CRT 依赖的深度排查
rust·交叉编译·逆向工程·reactos·pe格式·windows兼容
k4m7v2pz16 天前
在Arch Linux笔记本上搭建ReactOS 0.4.15虚拟机:从Mac远程开发调试Windows XP风格应用的完整指南
qemu·虚拟机·kvm·交叉编译·mingw-w64·reactos
深念Y1 个月前
技术探索记录 在 Android 手机上运行 One API
android·linux·服务器·智能手机·go·交叉编译·服务
今天也想躺ping1 个月前
linux系统移植pjsua库实现sip通话功能
linux·sip·交叉编译
想你依然心痛2 个月前
Buildroot快速构建——根文件系统与内核裁剪实战
交叉编译·根文件系统·包管理·启动优化·busybox·buildroot·内核裁剪
nnnnichijou3 个月前
Qt 6.9 嵌入式 Linux 交叉编译全栈填坑指南(以树莓派5 AArch64 为例
qt·嵌入式·交叉编译·qml·树莓派5
jrrz08283 个月前
Apollo OSQP库交叉编译
vscode·apollo·交叉编译·mpc·osqp