马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
minizip 是基于 zlib 的文件压缩解压缩开源库,在海思、瑞芯微这类 ARM 平台的交叉编译场景里经常被用到。本文记录在 Ubuntu 18.04 下用 gcc 编译 minizip,以及用 aarch64 交叉工具链交叉编译它的完整流程,包含源码来源对比、Makefile 的逐行改造和最终产出的 .a 与 .so。
minizip 是什么
minizip 最初由 Gilles Vollant 在 1998 年开发,从 zlib 1.1.2 起作为附加代码贡献被并入 zlib 发行版,此后持续有人维护和改进,原文项目至今仍能在 Mark Adler 维护的 zlib 发行版里找到。它是一个基于 zlib 的开源库,提供了一批功能完备、调用简单的接口,能处理 ZIP 这类常见压缩格式。
它的跨平台表现很好,Windows、Linux、macOS 都支持,因此从桌面小工具到服务端软件都有应用。唯一需要注意的是版权条款:zlib 仓库里的 minizip 遵循 zlib 自身的宽松许可,商用前建议确认你用的版本对应的许可证要求。
本文环境:编译系统 Ubuntu 18.04.6 LTS,编译器 gcc 7.5.0,交叉编译器 aarch64-mix210-linux-gcc,目标平台是海思 SS528。
源码下载:两个版本怎么选
minizip 现在有两套并行代码:
- 随 zlib 发布的那份,位于 zlib 仓库的 contrib/minizip 目录,当前 zlib 稳定版是 1.3.1,发布页在 madler/zlib 的 tags。这份是原始 minizip,久未大更新。
- minizip-ng,独立仓库,动机是补新特性并修原始库遗留缺陷——原始库停更太久。它大规模重构重写了代码,可读性更好,也给老版本的使用者提供了兼容层。
选型建议:只要能跑且不涉及新特性,用 zlib 里那份足够;如果项目需要长期维护、要读源码排错或者要用新格式能力,直接上 minizip-ng。本文用的是 zlib 中的 minizip。
第一步:先编译依赖库 zlib
minizip 强依赖 zlib,必须先把 zlib 编出来。做法与 minizip 类似:解压后配置前缀、编译、安装到指定目录,得到 include 头文件和 lib 下的 libz.so、libz.a 两类产物。这一步的产物路径下面两个 Makefile 都要引用,务必确认真实路径,写错会直接报找不到头文件。
第二步:本地 gcc 编译 minizip
- 把 minizip 源码复制一份出来,和 zlib 编译结果放在同级目录,例如
cp -r zlib-1.3.1/contrib/minizip/ ./。
- 进入 minizip 目录
cd minizip。
- 修改 Makefile,要点如下(下面给出一份可直接替换的版本):
ZLIB_PATH := ../result_gcc
CC ?= cc
AR ?= ar
CFLAGS := $(CFLAGS) -O2 -I$(ZLIB_PATH)/include -shared -fPIC
MINIZIP_SO_OBJS = unzip.o zip.o ioapi.o $(ZLIB_PATH)/lib/libz.so
MINIZIP_A_OBJS = unzip.o zip.o ioapi.o $(ZLIB_PATH)/lib/libz.a
.c.o:
$(CC) -c $(CFLAGS) $*.c
all: libminizip.a libminizip.so
libminizip.so: $(MINIZIP_SO_OBJS)
$(CC) $(CFLAGS) -o $@ $(MINIZIP_SO_OBJS)
libminizip.a: $(MINIZIP_A_OBJS)
$(AR) rcs $@ $(MINIZIP_A_OBJS)
clean:
rm -f *.o *.a *.so
三处关键:ZLIB_PATH 指向前面 zlib 的安装目录;编译选项加上 -fPIC,否则后面做动态库会报重定位错误;CFLAGS 里显式带 -I 引入 zlib 头文件。改完执行 make,目录里出现 libminizip.a 和 libminizip.so 即编译完成。
第三步:交叉编译到 ARM
流程同上,把编译器换成交叉工具链即可。前提是 zlib 也先用 aarch64-mix210-linux-gcc 交叉编过,产出对应的 arm 版 libz。然后同样复制一份 minizip、按上面内容修 Makefile,执行:
make CC=aarch64-mix210-linux-gcc AR=aarch64-mix210-linux-ar ZLIB_PATH=../result_mix210
交叉编出来的库不能直接拷到 x86 机器上跑,但可以用 file libminizip.so 确认架构是 ARM aarch64。平台换 Series 时把工具链前缀替换掉就行,Makefile 本身不用大改。
常见错误
- fatal error: zlib.h: No such file or directory:ZLIB_PATH 或 -I 路径写错,确认 include 目录里真有 zlib.h。
- 链接报 undefined reference to deflate:libz.a 没被加进 MINIZIP_A_OBJS,或链接顺序反了。
- 编译动态库报 relocation R_X86_64_32 against:少了 -fPIC。
- 生成的库在 ARM 板上跑不起来:十有八九编错了架构,确认 CC 是交叉编译器而不是系统 gcc。
qidao123.com企服评测-应用市场 编辑提示 |