开发过程中需要解压.zip文件的功能。 查阅资料后尝试使用开源库zlib中提供的源码。 本文记录了具体的调用实现和学习过程,方便后续问题发现和补充。
跨平台环境:C/C++/+VS/+Make/zlib-1.2.11
参考文章:
zlib官网:zlib首页使用一栏解压多个文件(基于zlib) - CSDN博客:zip压缩/解压库(zlib库的重新编译)
文章[2]对zlib有非常详细的介绍,可以对这个库有更清晰的认识。 我们将根据本文的描述尝试记录调用过程,继续改造库并开放调用接口。
1.Linux平台
下载zlib源码,这里只是压缩包格式的区别,我选择
在zlib根目录下编译得到libz.so
ross@ubuntu:~/Desktop/zlib-1.2.11$ ./configure
ross@ubuntu:~/Desktop/zlib-1.2.11$ make
进入/目录进行编译,得到,两个执行文件
ross@ubuntu:~/Desktop/zlib-1.2.11/contrib/minizip$ make
测试并,通过命令行调用,帮助信息如下
ross@ubuntu:~/Desktop/zlib-1.2.11/contrib/minizip$ ./minizip -o -9 target.zip a.txt b.txt
ross@ubuntu:~/Desktop/zlib-1.2.11/contrib/minizip$ ./miniunz -o target.zip
ross@ubuntu:~/Desktop/zlib-1.2.11/contrib/minizip$ ./minizip
MiniZip 1.1, demo of zLib + MiniZip64 package, written by Gilles Vollant
more info on MiniZip at http://www.winimage.com/zLibDll/minizip.html
Usage : minizip [-o] [-a] [-0 to -9] [-p password] [-j] file.zip [files_to_add]
-o Overwrite existing file.zip
-a Append to existing file.zip
-0 Store only
-1 Compress faster
-9 Compress better
-j exclude path. store only the file name.
ross@ubuntu:~/Desktop/zlib-1.2.11/contrib/minizip$ ./miniunz
MiniUnz 1.01b, demo of zLib + Unz package written by Gilles Vollant
more info at http://www.winimage.com/zLibDll/unzip.html
Usage : miniunz [-e] [-x] [-v] [-l] [-o] [-p password] file.zip [file_to_extr.] [-d extractdir]
-e Extract without pathname (junk paths)
-x Extract with pathname
-v list files
-l list files
-d directory to extract into
-o overwrite files without prompting
-p extract crypted file using password
zlib的调用方法可以在其源码的main()函数中查看。 根据我的理解,zlib的压缩功能是在main()函数中通过调用zlib库中的函数来实现的。 (相似地)
为了在项目中调用更加方便,可以考虑修改为动态库调用方式。 (静态库同理)
修改.c,.c中的main函数为动态库接口函数,并添加新的头文件
//miniunz.h
extern int ZEXPORT unzip(filename, path)
修改文件编译成动态库(参考文章[3])
CC=cc
CFLAGS=-O2 -I../.. -shared -fPIC
MINIZIP_OBJS = ioapi.o mztools.o unzip.o zip.o miniunz.o minizip.o ../../libz.so
.c.o:
$(CC) -c $(CFLAGS) $*.c
all: libminizip.so
libminizip.so: $(MINIZIP_OBJS)
$(CC) $(SHARE) $(CFLAGS) -o $@ $(MINIZIP_OBJS)
clean:
/bin/rm -f *.o *~ libminizip.so
完成上述修改后,执行make编译.so。 根据参考文章[3]中的描述,它不依赖libz.so。
以后就可以通过工程中的头文件和.so来调用上述自定义名称的压缩/解压函数了。
2. 平台
终端源码与Linux终端源码相同,提供的zlib解决方案可以在源码的zlib-1.2.11\\路径中找到。
用vs打开.sln,编译工程生成zlib动态库和静态库、.dll和.lib
编译/解压即可得到对应的执行文件。 为了方便工程调用,修改工程属性来编译生成动态库。 修改方法与Linux平台章节相同:新建头文件,将main()函数修改为导出函数。
另外,zlib源代码是用C语言编写的。 在C++项目中调用时,需要注意关键字的使用,需要添加
extern "C" {
int unzip(char* filename, char* path);
}
此时,您可以获得.dll或.lib,可以轻松地将其集成到项目中。