转自wo13142yanyouxin原文vs2013载入zlib库,即include "zlib.h"

在程序中,我们经常要用到压缩,解压函数。以压缩函数compress为例进行说明。步骤如下:

1,官网(GO TO)上下载zlib库,我下载的是zlib-1.2.11库(当下最新的就好),解压文件。

2,找到vs2013自身的命令提示窗口:开始——所以程序———vs2013————Visual Studio Tools————VS2013 x64 本机工具命令提示。

3,在打开的命令行中转换到“zlib-1.2.11\zlib-1.2.11\contrib\masmx64”目录中,执行bld_ml64.bat文件(32位电脑进入masmx32中),此时会生成2个obj文件。

4,调用“ml”命令,ml是vs2013中一个ml.exe执行程序。如果此时报“ml不是可执行命令,,,,”,在vs2013的安装目录中找ml.exe,复制到“zlib-1.2.11\zlib-1.2.11\contrib\masmx64”目录中,就可以解决这个问题了。调用ml命令编译inffas32.asm和match686.asm,生成inffas32.obj和match686.obj(生成在本目录下)。这两个文件在zlibvc中用到

5,进入"\zlib-1.2.11\zlib-1.2.11\contrib\vstudio\vc11"目录中,找到zlibvc.sln,执行:

(1). zlibvc生成动态链接库zlibwapi.dll和对应的导入库zlibwapi.lib
                  (2). zlibstat生成静态链接库zlibstat.lib
                  (3). testzlibdll测试生成的动态链接库zlibwapi.dll
                  (4). testzlib测试生成的静态链接库zlibstat.lib        
  最后我们在debug模式下编译整个解决方案。生成的dll和lib文件可在相应的文件夹中找到在编译中可能会出现下面问题:

  1.error LNK2026: module unsafe for SAFESEH image修改属性/linker/高级/映像具有安全异常处理程序/ YES 改为 No

  2.fatal error LNK1118: syntax error in ‘version’ statement打开zlibvc.def文件VERSION 修改为1.28即可(原来是1.2.8)

6,环境已经搭好,接下来进行测试:新建一个测试程序,并且设置属性

a. 包含头文件
                属性--C/C++--常规--附加包含目录(添加包含.h的目录)
             b. 定义宏
                属性--C/C++--预处理器--预处理器定义:添加 ZLIB_WINAPI(一定要加,否则提示“无法解析外部命令”)
             c. 项目包含.lib文件所在的目录:
                  属性--链接器--常规--附加库目录
             d. 项目包含.lib文件
                       属性--链接器--输入--附加依赖项(zlibwapi.lib)
              e. 项目代码中 #include "zlib.h"
                        编译生成.exe文件需要.dll文件支持(动态加载)

7进行测试,代码如下(本人亲测,绝对可以运行

#include <stdlib.h>
#include <stdio.h>
#include <zlib.h>
int main(int argc, char* argv[])
{
FILE* file;
uLong flen;
unsigned char* fbuf = NULL;
uLong clen;
unsigned char* cbuf = NULL;
/* 通过命令行参数将srcfile文件的数据压缩后存放到dstfile文件中 */
if (argc < 3)
{
printf("Usage: zcdemo srcfile dstfile\n");
return -1;
} if ((file = fopen(argv[1], "rb")) == NULL)
{
printf("Can\'t open %s!\n", argv[1]);
return -1;
}
/* 装载源文件数据到缓冲区 */
fseek(file, 0L, SEEK_END); /* 跳到文件末尾 */
flen = ftell(file); /* 获取文件长度 */
fseek(file, 0L, SEEK_SET);
if ((fbuf = (unsigned char*)malloc(sizeof(unsigned char)* flen)) == NULL)
{
printf("No enough memory!\n");
fclose(file);
return -1;
}
fread(fbuf, sizeof(unsigned char), flen, file);
/* 压缩数据 */
clen = compressBound(flen);
if ((cbuf = (unsigned char*)malloc(sizeof(unsigned char)* clen)) == NULL)
{
printf("No enough memory!\n");
fclose(file);
return -1;
}
if (compress(cbuf, &clen, fbuf, flen) != Z_OK)
{
printf("Compress %s failed!\n", argv[1]);
return -1;
}
fclose(file); if ((file = fopen(argv[2], "wb")) == NULL)
{
printf("Can\'t create %s!\n", argv[2]);
return -1;
}
/* 保存压缩后的数据到目标文件 */
fwrite(&flen, sizeof(uLong), 1, file); /* 写入源文件长度 */
fwrite(&clen, sizeof(uLong), 1, file); /* 写入目标数据长度 */
fwrite(cbuf, sizeof(unsigned char), clen, file);
fclose(file); free(fbuf);
free(cbuf); return 0;
}

补充:上面的都是一些基本操作,我觉得虽然这样函数都被封装好了,但是我觉得自己应该还是要知道其原理,所以我自己总结了一些关于压缩的方面的知识:见我的下一个博客,,,,

最新文章

  1. Android开发中的menu菜单
  2. mongo3.x ssl版安装文件
  3. MyBatis知多少(26)调试
  4. PHP学习笔记06——面向对象版图形计算器
  5. nenu contest
  6. JS倒计时 代码
  7. Solr In Action 笔记(3) 之 SolrCloud基础
  8. Fragement理解
  9. 在O(1) 时间删除链表节点
  10. C#之再议数组和集合
  11. android开发之多线程实现方法概述
  12. Entropy
  13. [POJ 3487]The Stable Marriage Problem
  14. 进程管理工具supervisor的使用
  15. 汉语言处理工具pyhanlp的简繁转换
  16. Hinge Loss、交叉熵损失、平方损失、指数损失、对数损失、0-1损失、绝对值损失
  17. Spring AOP详解和实现方式
  18. 理解JVM GC
  19. 无锁并发框架Disruptor学习入门
  20. liunx网络基本命令

热门文章

  1. 详细的Windows下安装 binwalk
  2. alert(1) to win部分解题
  3. python 学习分享-常用模块篇
  4. Python学习-day14-前台总结
  5. Halcon18 Mac os 下载
  6. 贪吃蛇—C—基于easyx图形库(上):基本控制函数实现 画图程序
  7. rm 、git rm 、git rm --cached的区别
  8. PHP简单登录退出代码
  9. JDBC 学习笔记(九)—— ResultSetMetaData
  10. 节点流——FileReaderWriter