一、参考资料
瑞芯微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
下载并解压源码。
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