vs2013载入zlib库,即include "zlib.h"
转自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; }
补充:上面的都是一些基本操作,我觉得虽然这样函数都被封装好了,但是我觉得自己应该还是要知道其原理,所以我自己总结了一些关于压缩的方面的知识:见我的下一个博客,,,,
没有整理与归纳的知识,一文不值!高度概括与梳理的知识,才是自己真正的知识与技能。 永远不要让自己的自由、好奇、充满创造力的想法被现实的框架所束缚,让创造力自由成长吧! 多花时间,关心他(她)人,正如别人所关心你的。理想的腾飞与实现,没有别人的支持与帮助,是万万不能的。