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
相关推荐
nnnnichijou3 天前
Qt 6.9 嵌入式 Linux 交叉编译全栈填坑指南(以树莓派5 AArch64 为例
qt·嵌入式·交叉编译·qml·树莓派5
jrrz082822 天前
Apollo OSQP库交叉编译
vscode·apollo·交叉编译·mpc·osqp
六点的晨曦2 个月前
OpenCV 4.3 交叉编译 AArch64 完整指南(x64 Ubuntu 20.04)
opencv·交叉编译·ubuntu20.04·aarch64
seaside20033 个月前
ggml交叉编译安卓部署大模型
安卓·交叉编译·ggml
特立独行的猫a5 个月前
鸿蒙PC生态三方命令行软件移植:XZ压缩工具移植到鸿蒙PC平台的完整指南
华为·harmonyos·移植·命令行·交叉编译·xz命令
威桑5 个月前
交叉编译过程中的踩坑与收获
linux·c++·arm·交叉编译
特立独行的猫a5 个月前
鸿蒙PC三方库编译libiconv链接报错,解决 libtool 链接参数丢失问题过程总结
harmonyos·交叉编译·libiconv·三方库·鸿蒙pc·libtool
特立独行的猫a5 个月前
鸿蒙PC命令行及三方库libiconv移植:鸿蒙PC生态的字符编码基石
harmonyos·交叉编译·libiconv·三方库移植·鸿蒙pc