首先了解zlib 历史

  1. zlib的概述。https://zlib.net/
  2. zlib的版本。https://zlib.net/
  3. zlib的cmake 编译出不同平台库,首先的准备好源码(源码可在https://zlib.net/ 中下载)。编译界面了下网络大神的 理解很透彻。 

    进入到zlib-1.2.11目录下,发现有个Makefile文件,打开如下,

    这是个提示,让我们先运行./configure。按照提示我们在终端输入./configure并回车,运行完毕后再打开看Makefile,发现里面就有内容了,

    此时在终端输入make,这样zlib源码就开始编译了。
    编译完毕后如果输入make install,就可以把编译好的zlib库放在系统路径里,以后写代码就可以直接调用zlib提供的库函数了。
    以上这些操作信息是写在源码目录下的readme文件里的,这里截取一段,

    还有讲example的,告诉我们example源码在哪,

    源码目录下还有个INDEX文件,里面叙述了构成zlib的所有public header files和private source files,有了这些信息,就可以很方便的把需要的源码集成到自己的工程中去。

    可以看出作者的文档写的非常好。

使用minizip  比较简单

minizip解压多文件!minizip源码目录在zlib-1.2.11/contrib目录下。

将一下文件 引入到项目中使用即可:

具体使用的例子:

//解压代码片段 本例子将代码解压到和zip文件同一目录下
void ZipUtil::UnzipFile(const char *strFilePath)
{
//    LOGDBG("===========================");clock_t start = clock();if (strFilePath == NULL || strlen(strFilePath) == 0) {printf("Zip Path Error!%s\n", strFilePath);return; }std::string rootPath = strFilePath;if (rootPath.substr(rootPath.find_last_of(".")).compare(ZIP_SUFFIX) != 0) {printf("File Type Error!%s \t", strFilePath);return;}rootPath = rootPath.substr(0, rootPath.find_last_of("/")) + "/";unzFile zipFile = unzOpen(strFilePath);// Open the zip fileif (zipFile == NULL) {printf("not found\n");return;}unz_global_info globalInfo;if (UNZ_OK != unzGetGlobalInfo(zipFile, &globalInfo)) {printf("获取全局zip信息失败!\n");unzClose(zipFile);zipFile = NULL;return;}int zipInfo = unzGoToFirstFile(zipFile);if (UNZ_OK != zipInfo) {printf("无法获取zip包内文件信息zip包可能是null的!\n");unzClose(zipFile);zipFile = NULL;return;}char read_buffer[READ_SIZE];uLong i;for (i = 0; i < globalInfo.number_entry; ++i) {// Get info about current file.unz_file_info file_info;char filename[MAX_FILENAME];if (unzGetCurrentFileInfo(zipFile,&file_info,filename,MAX_FILENAME,NULL, 0, NULL, 0)!= UNZ_OK) {printf("could not read file info\n");unzClose(zipFile);return;}//名字拼接 解压到同一目录下std::string fileNameStr = rootPath + filename;strncpy(filename, fileNameStr.c_str(), fileNameStr.length() + 1);// Check if this entry is a directory or file.const size_t filename_length = strlen(filename);if (filename[filename_length - 1] == dir_delimter) {// Entry is a directory, so create it.printf("dir:%s\n", filename);mkdir(filename, 0775);}else {// Entry is a file, so extract it.printf("file:%s\n", filename);if (unzOpenCurrentFile(zipFile) != UNZ_OK) {printf("could not open file\n");unzClose(zipFile);return;}// Open a file to write out the data.FILE *out = fopen(filename, "wb");if (out == NULL) {printf("could not open destination file\n");unzCloseCurrentFile(zipFile);unzClose(zipFile);return;}int error = UNZ_OK;do {error = unzReadCurrentFile(zipFile, read_buffer, READ_SIZE);if (error < 0) {printf("error %d\n", error);unzCloseCurrentFile(zipFile);unzClose(zipFile);return;}// Write data to file.if (error > 0) {fwrite(read_buffer, error, 1, out);// You should check return of fwrite...}} while (error > 0);fclose(out);}unzCloseCurrentFile(zipFile);// Go the the next entry listed in the zip file.if ((i + 1) < globalInfo.number_entry) {if (unzGoToNextFile(zipFile) != UNZ_OK) {printf("cound not read next file\n");unzClose(zipFile);return;}}}unzClose(zipFile);clock_t end = clock();printf("Elapsed Time %f\n", (double) (end - start));
}

备注

在应用到Android的时候报错:

类似下面代码,主要是因为Android这边没有进行宏定义

/jni/ioapi.c:127: error: undefined reference to 'fopen64'
/jni/ioapi.c:157: error: undefined reference to 'ftello64'
/jni/ioapi.c:203: error: undefined reference to 'fseeko64'
/jni/miniunz.c:380: error: undefined reference to 'fopen64'
/jni/miniunz.c:411: error: undefined reference to 'fopen64'
/jni/miniunz.c:420: error: undefined reference to 'fopen64'

解决办法:修改contrib/minizip/ioapi.h, 增加以下宏定义即可:

#ifdef __ANDROID__#define fopen64 fopen#ifdef __USE_FILE_OFFSET64#define ftello64 ftello#define fseeko64 fseeko#else#define ftello64 ftell#define fseeko64 fseek#endif
#endif

将 zlib 引入到C++项目中 历程相关推荐

  1. vue使用ts 引入组件_vue项目中使用ts(typescript)入门教程

    最近项目需要将原vue项目结合ts的使用进行改造,这个后面应该是中大型项目的发展趋势,看到一篇不错的入门教程,结合它并进行了一点拓展记录之.本文从安装到vue组件编写进行了说明,适合入门. 1.引入T ...

  2. iconfont小图标从下载到引入到vue项目中的详细教程

    地址:iconfont-阿里巴巴矢量图标库 iconfont小图标下载:  (1)查找图标 在搜索框直接文字搜索或者看下面的小图标库,找想要的,每个小图标库都有一个名字,比如:"阿里云官网& ...

  3. mave本地导入mysql的jar包_将本地的jar包引入到maven项目中

    首先进入到maven的目录下,并且将要引入的jar包也放在这个目录下 然后执行命令 mvn install:install-file -Dfile=checkDataAdapter-api.jar - ...

  4. vue 引入外部less_Vue项目中引入外部文件的方法(css、js、less)

    这两天学习了Vue.js ,正好了解了如何引入外部文件的方法,而且很重要,所以,今天添加一点小笔记. 例子中css文件采用bootstrap.css,js文件采用jQuery,less文件用less. ...

  5. 通过iframe引入另外一个项目中的html片段到项目中,解决样式,高度,兼容等问题的策略

     <!--尾部开始-->  <iframe src="http://172.16.24.11:9000/cartoon-web/footer_new"     ...

  6. java extjs如何使用_ExtJS初探:在项目中使用ExtJS

    注意:本文写作时间是 2013 年,所讲的 ExtJS 如今早已过时,请勿学习! -------------------------------- 今天ExtJS官网发布了ExtJS最新正式版4.2. ...

  7. Vue.js + Nuxt.js 项目中使用 Vee-validate 表单校验

    vee-validate 是为 Vue.js 量身打造的表单校验框架,允许您校验输入的内容并显示对应的错误提示信息.它内置了很多常见的校验规则,可以组合使用多种校验规则,大部分场景只需要配置就能实现开 ...

  8. maven不引入parent_Idea开发环境中,开发springboot类型的项目,如果只引入parent节点,不添加依赖节点,maven是不会加载springboot的任何依赖的...

    在SpringBoot类型的项目中,我本来是要使用pringBoot,创建一个Console项目,我原本在pom.xml中添加paren节点了,天真的认为不需要再添加其他任何依赖了,可是接下来的1个小 ...

  9. vue ajax highcharts,在vue项目中引入highcharts图表的方法(详解)

    npm进行highchars的导入,导入完成后就可以进行highchars的可视化组件开发了 npm install highcharts --save 1.components目录下新建一个char ...

最新文章

  1. bios调整服务器性能模式吗,优化BIOS设置提高显示性能
  2. noip考python吗_青少年信奥联赛(NOIP)改名重推实锤!带着“不建议”硬刚到底?...
  3. pytorch 学习: STGCN
  4. private访问权限java_Java之访问权限
  5. 隐马尔可夫模型中的Viterbi算法zz
  6. black.lst 丢失或被破坏,怎么解决
  7. 正睿2019省选附加赛 Day10 (这篇其实已经都咕咕了...)
  8. java地址自动拆分_java – Hibernate:每个月自动拆分表
  9. SQL老司机,居然是这样智能挖掘异常日志
  10. 后台返回给前端json字段的大小写问题,Lombok的坑@Data,@Getter
  11. python 正则匹配电话与ip
  12. keil如何下载STM32芯片F1/F4固件库
  13. 疯狂java讲义pdf百度云,附大厂真题面经
  14. PyQt5-使用QDialog显示通用对话框
  15. 电脑桌面计算机图标下不显示文字,电脑桌面图标下面的文字有时会突然不见,然后 – 手机爱问...
  16. Python数据分析学习 二
  17. Oracle数据库启动与关闭
  18. 第41课:Checkpoint彻底解密:Checkpoint的运行原理和源码实现彻底详解
  19. PDPS15.0机器人汽车件焊接 喷涂 人机仿真视频教程
  20. 大数据开发和java的前景_大数据开发和javaEE后端开发哪个就业前景好?

热门文章

  1. 三相SVPWM逆变器MATLAB仿真实验,三相SVPWM逆变电路MATLAB仿真.doc
  2. 码云webhook node版
  3. matplotlib调整坐标轴最小刻度单位,坐标轴主副刻度单位
  4. python用while做九九乘法表_Python 语法控制(含用while和for实现九九乘法表)
  5. linux服务器防御ddos,linux如何防御ddos
  6. C语言习题:输入10个学生5门课的成绩,分别用函数实现下列功能:①计算每个学生的平均分;②计算每门课的平均分;③找出所有50个分数中最高的分数所对应的学生和课程;④计算平均分方差;
  7. winscp,winscp连接
  8. FastqC结果简介
  9. 理解CU微操作命令(控制信号)
  10. rrpp协议如何修改_RRPP单环