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 库成功地完成了解压缩功能。