【开源库 | minizip】Linux(Ubuntu18.04)下,minizip的编译、交错编译

[复制链接]
发表于 2026-10-4 15:12:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×

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

  1. 把 minizip 源码复制一份出来,和 zlib 编译结果放在同级目录,例如 cp -r zlib-1.3.1/contrib/minizip/ ./。
  2. 进入 minizip 目录 cd minizip。
  3. 修改 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企服评测-应用市场 编辑提示

回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表