zlib 文件压缩库

更新时间:
2024-05-13
下载文档

zlib 文件压缩库

zlib 是目前应用广泛的文件压缩库,如 Linux、OpenSSL、libpng、ffmpeg 等工程均使用 zlib,同时还有数千种软件依赖 zlib 提供的压缩服务工作。

Zlib 库移植

本节介绍如何在 RealEvo-IDE 下编译 zlib 库,从网站 http://www.zlib.net/ 下载 zlib 源代码,文件名为 zlib-1.2.8.tar.xz,使用解压软件解压到当前文件夹。解压后的文件所在文件夹名称为 zlib-1.2.8。

进入 zlib-1.2.8 文件夹,打开 /watcom/watcom_l.mak 文件。文件内容如下:

C_SOURCE =  adler32.c    compress.c    crc32.c       deflate.c    &
            gzclose.c    gzlib.c       gzread.c      gzwrite.c    &
            infback.c    inffast.c     inflate.c     inftrees.c   &
            trees.c      uncompr.c     zutil.c

其中 *.c 文件是实现 zlib 库压缩功能的程序源文件。将 zlib-1.2.8 文件夹下中同名的 *.c 文件拷贝到一个独立文件夹 zlib 下,并将相关的 *.h 文件也一并拷贝到 zlib 目录下。

打开 RealEvo-IDE,创建“SylixOS Shared Lib”类型工程,工程名称为 zlib_dll,将 zlib 文件夹下的 *.c 和 *.h 文件拷贝到工程 zlib_dll 的目录下,并将工程创建时自动生成的 zlib_dll.c 文件删除。

修改 zlib_dll 工程的 Makefile,将 SRCS 修改如下:

#***************************************************************************
# src(s) file
#***************************************************************************
SRCS =             \
    adler32.c      \
    compress.c      \
    crc32.c      \
    deflate.c      \
    gzclose.c      \
    gzlib.c      \
    gzread.c      \
    gzwrite.c      \
    infback.c      \
    inffast.c      \
    inflate.c      \
    inftrees.c      \
    trees.c      \
    uncompr.c      \
    zutil.c

SRCS 与 watcom_l.mak 文件下的 C_SOURCE 相同。修改 target 输出文件名如下

#***************************************************************************
#  target
#***************************************************************************
LIB = $(OUTPATH)/libzlib.a
DLL = $(OUTPATH)/libzlib.so

注意
target 部分的修改不是必须的,这里修改仅仅是为了生成的文件名更符合使用习惯。

编译成功后在 Debug 目录下生成 target 中定义的两个文件。至此已经完成了 zlib 库在 SylixOS 下编译移植。

下面验证 zlib 在 SylixOS 下是否可以正常使用。新建“SylixOS App”工程(工程名为:zlib_app),将生成的工程文件更改如下:

#include <stdio.h>
#include <zlib.h>
int main (int  argc, char  *argv[]) 
{
       unsigned char data_in[]        = "hello world! aaaaa bbbbb ccccc
                                         ddddd 1234567890 notrecongen yes";
       unsigned char buf[1024]         = {0};
       unsigned char data_out[1024]    = {0};
       unsigned long srcLen         = sizeof(data_in);
       unsigned long bufLen         = sizeof(buf);
       unsigned long dstLen         = sizeof(data_out);
       fprintf(stdout, "src string:%s\nlength:%ld\n", data_in, srcLen);
       compress(buf, &bufLen, data_in, srcLen);                /*  压缩             */
fprintf(stdout, "after compressed length:%ld\n", bufLen);
       uncompress(data_out, &dstLen, buf, bufLen);           /*  解压缩             */
       fprintf(stdout, "after uncompressed length:%ld\n",dstLen);
       fprintf(stdout, "uncompressed string:%s\n",data_out);
    return  (0);
} 

修改 zlib_app.mk,在 include path 下添加头文件包含路径,修改如下:

LOCAL_INC_PATH += -I"../zlib_dll"

添加 zlib 库文件名称和目录

#***************************************************************************
# depend dynamic library
#***************************************************************************
LOCAL_DEPEND_LIB     += -lzlib
#***************************************************************************
# depend dynamic library search path
#***************************************************************************
LOCAL_DEPEND_LIB_PATH    += -L"../zlib_dll/$(OUTDIR)" 

注意
动态库名称的填写,在 zlib_dll 工程中生成的文件是 libzlib.so 文件,在填写的时候头尾都去除,并添加了-l。

Zlib 库验证

将 libzlib.so 文件上传到 SylixOS 设备中的/lib 目录下,在 SylixOS Shell 下运行程序,结果如下:

# ./Zlib_library_Usage 
Src string:hello world! aaaaa bbbbb ccccc ddddd 1234567890 notrecongen yes
Length:64
After Compressed Length:62
After UnCompressed Length:64
UnCompressed String:hello world! aaaaa bbbbb ccccc ddddd 1234567890 notrecongen yes

从程序的运行结果可以看出通过 zlib 库成功地完成了解压缩功能。

文档内容是否对您有所帮助?
有帮助
没帮助