zlib使用方法

因为我需要使用libpng,可是将libpng和自己下载的zlib包放一起编译就是有错。结果还是使用libpng工程里面提供的zlib工程文件编译的。编译好使用就非常方面了。


由于优快云中,有个大牛已经给出了详细的使用方法,本人就不多做什么了。



链接:

1. http://blog.youkuaiyun.com/querw/article/details/1452041                   

2. http://blog.youkuaiyun.com/newish21/article/details/1726908

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



2. 用VC++6.0打开

把下载的源代码解压打开,VC6.0的工程已经建好了,在/projects/visualc6. 双击zlib.dsw, 可以在VC++6.0中看到里面有3个工程: zlib 是库文件(编译设置选中 win32 lib debug / release), 工程example 是如何使用 zlib.lib 的示例, 工程minigzip 是如何用 zlib 提供的函数读写.gz文件的示例(*.gz的文件一般Linux下比较常用).

3. 如何加入到我的工程

编译好 zlib.lib 后, 你就得到了调用一个静态库所需要的所有文件了(zlib.lib, zlib.h, zconf.h). 如何调用静态库不用我说了吧.  (在Project -> Settings -> general  将Microsofr Foundation Classes 的 not using MFC 改为 use MFC in a shared DLL)

4. 用zlib能干什么

先来看看 zlib 都提供了那些函数, 都在zlib.h中,看到一堆宏不要晕,其实都是为了兼容各种编译器和一些类型定义.死死抓住那些主要的函数的原型声明就不会受到这些东西的影响了.

关键的函数有那么几个:

(1)int compress (Bytef *dest,   uLongf *destLen, const Bytef *source, uLong sourceLen);

把源缓冲压缩成目的缓冲, 就那么简单, 一个函数搞定

(2) int compress2 (Bytef *dest,   uLongf *destLen,const Bytef *source, uLong sourceLen,int level);

功能和上一个函数一样,都一个参数可以指定压缩质量和压缩数度之间的关系(0-9)不敢肯定这个参数的话不用太在意它,明白一个道理就好了: 要想得到高的压缩比就要多花时间

(3) uLong compressBound (uLong sourceLen);

计算需要的缓冲区长度. 假设你在压缩之前就想知道你的产度为 sourcelen 的数据压缩后有多大, 可调用这个函数计算一下,这个函数并不能得到精确的结果,但是它可以保证实际输出长度肯定小于它计算出来的长度

(4) int uncompress (Bytef *dest,   uLongf *destLen,const Bytef *source, uLong sourceLen);

解压缩(看名字就知道了:)

(5) deflateInit() + deflate() + deflateEnd()

3个函数结合使用完成压缩功能,具体用法看 example.c 的 test_deflate()函数. 其实 compress() 函数内部就是用这3个函数实现的(工程 zlib 的 compress.c 文件)

(6) inflateInit() + inflate() + inflateEnd()

和(5)类似,完成解压缩功能.

(7) gz开头的函数. 用来操作*.gz的文件,和文件stdio调用方式类似. 想知道怎么用的话看example.c 的 test_gzio() 函数,很easy.

(8) 其他诸如获得版本等函数就不说了.

总结: 其实只要有了compress() 和uncompress() 两个函数,在大多数应用中就足够了.

题外话: 我最初看到zlib的源代码时被好多宏吓倒了,呵呵,后来仔细看下去才发现原来接口那么简单. 至于那些英文说明也没想象中的那么难懂.只要有尝试的勇气,总能有些收获.

 

 

#include <iostream>
#include <stdlib.h>
#include "zlib.h"

using namespace std;

#define MaxBufferSize 1024*10

void main()
{
    int i;

    FILE* File_src;
    FILE* File_tmp;
    FILE* File_dest;

    unsigned long  len_src;
    unsigned long len_tmp;
    unsigned long len_dest;

    unsigned char *buffer_src  = new unsigned char[MaxBufferSize];
    unsigned char *buffer_tmp  = new unsigned char[MaxBufferSize];
    unsigned char *buffer_dest = new unsigned char[MaxBufferSize];

    File_src = fopen("src.txt","r");
    len_src = fread(buffer_src,sizeof(char),MaxBufferSize-1,File_src);

    for(i = 0 ; i < len_src ; ++i)
    {
        cout<<buffer_src[i];
    }
    cout<<endl;
    compress(buffer_tmp,&len_tmp,buffer_src,len_src);

    File_tmp = fopen("tmp.txt","w");
    fwrite(buffer_tmp,sizeof(char),len_tmp,File_tmp);

    for(i = 0 ; i < len_tmp ; ++i)
    {
        cout<<buffer_tmp[i];
    }
    cout<<endl;

    uncompress(buffer_dest,&len_dest,buffer_tmp,len_tmp);

    File_tmp = fopen("tmp.txt","r");
    File_dest = fopen("dest.txt","w");
    fwrite(buffer_dest,sizeof(char),len_dest,File_dest);

    for(i = 0 ; i < len_dest ; ++i)
    {
        cout<<buffer_dest[i];
    }
    cout<<endl;

}


<think>好的,我现在需要帮助用户了解如何使用zlib库。用户提供的引用内容提到了配置目录、编译方法以及安装检查等步骤。首先,我应该整理这些信息,按照逻辑顺序呈现,确保用户能够一步步操作。 首先,用户可能需要安装zlib库。根据引用2,zlib的官网和GitHub仓库是获取源代码的地方。我应该指导用户下载源码并编译。不同的平台(如Windows、Linux)编译步骤不同,需要分开说明。比如在Ubuntu下使用cmake,而Windows可能需要使用Visual Studio。 接下来,配置开发环境。引用1提到创建lib文件夹,存放库文件,并使用相对路径。这里需要详细说明如何在项目中包含头文件和链接库文件,特别是在不同IDE中的设置方法,比如Visual Studio的项目属性配置,或者Linux下的Makefile编写。 然后,使用zlib的基本函数。用户可能对压缩和解压缩的具体函数调用感兴趣。引用3提到了标准ZLib函数,比如compress和uncompress,以及Qt的qCompress。需要给出示例代码,并解释每个参数的作用,比如压缩级别和内存管理。 此外,可能需要注意不同平台下的库文件版本,如引用1提到的不同配置和平台使用不同版本的库目录。要提醒用户根据自己环境选择合适的文件,避免兼容性问题。 用户可能还会遇到常见问题,比如链接错误或内存泄漏。应该提前给出解决方法,例如检查库路径是否正确,或者使用zlib的版本。同时,强调错误处理的重要性,比如检查返回值。 最后,按照用户的要求生成相关问题,比如如何交叉编译zlib,或者如何压缩文件。这些问题需要基于引用内容,比如引用2提到的交叉编译,或者引用3中的安装检查步骤。 确保整个回答结构清晰,步骤分明,代码示例正确,并且引用标识正确添加在相关段落末尾。检查LaTeX格式是否符合要求,行内公式用$包裹,独立公式用$$。但根据用户的问题,可能不需要数学公式,但如果有提到算法,比如压缩算法,可能需要适当加入。不过zlib使用更多是API调用,可能不需要数学表达式,所以保持内容简洁即可。 总结步骤:安装配置、环境设置、基本函数使用、示例代码、注意事项、常见问题。最后列出相关问题,引导用户进一步探索。</think>### zlib使用教程 #### 1. 安装与配置 **步骤1:下载源码** 从官网或GitHub获取最新源码[^2]: - 官网地址:https://zlib.net/ - GitHub仓库:https://github.com/madler/zlib/ **步骤2:编译源码** - **Linux/Ubuntu**: 使用以下命令编译并安装: ```bash ./configure make sudo make install ``` 交叉编译需指定工具链,例如: ```bash CC=arm-linux-gnueabihf-gcc ./configure --prefix=/opt/zlib make && make install ``` - **Windows**: 使用Visual Studio打开`contrib/vstudio`中的工程文件编译生成`.lib`或`.dll`文件[^3]。 **步骤3:配置开发环境** - **包含目录**:将zlib头文件目录(如`zlib/include`)添加到项目的包含路径。 - **库目录**:将编译生成的库文件(如`zlib.lib`或`libz.a`)放入项目的`lib`文件夹,并在链接器中指定路径[^1]。 *示例(Visual Studio)*: ```text 项目属性 → 链接器 → 附加库目录:.\lib 附加依赖项:zlib.lib ``` --- #### 2. 基本函数使用 zlib提供以下核心功能: - **压缩**:使用`compress()`或`deflate()`函数。 - **解压**:使用`uncompress()`或`inflate()`函数。 **示例代码(C语言)**: ```c #include <zlib.h> #include <stdio.h> int main() { char src[] = "Hello, zlib!"; uLong src_len = strlen(src) + 1; uLong dest_len = compressBound(src_len); Bytef *dest = (Bytef*)malloc(dest_len); // 压缩数据 if (compress(dest, &dest_len, (Bytef*)src, src_len) != Z_OK) { fprintf(stderr, "压缩失败\n"); return 1; } // 解压数据 char *uncompressed = (char*)malloc(src_len); if (uncompress((Bytef*)uncompressed, &src_len, dest, dest_len) != Z_OK) { fprintf(stderr, "解压失败\n"); return 1; } printf("解压结果: %s\n", uncompressed); free(dest); free(uncompressed); return 0; } ``` --- #### 3. 注意事项 1. **内存管理**: - 压缩前需通过`compressBound()`计算目标缓冲区大小。 - 解压时需预先知道原始数据长度。 2. **错误处理**: 检查函数返回值(如`Z_OK`、`Z_MEM_ERROR`)以处理异常情况。 3. **跨平台兼容性**: Windows需区分静态库(`.lib`)和动态库(`.dll`),Linux通常使用`.a`或`.so`[^1][^3]。 --- #### 4. 常见问题 - **Q:编译时提示“找不到zlib.h”** **A**:检查包含目录是否配置正确,确保头文件路径被添加到项目中[^1]。 - **Q:链接时出现未定义符号错误** **A**:确认库文件路径和名称正确,且与编译平台(Debug/Release、x86/x64)匹配。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值