windows下使用zlib库进行数据校验的步骤

时间:2022-09-26 23:19:52

    我在进行socket编程的时候,想将发送的数据用adler32函数进行校验,并且在接收端进行验证。在linux可以直接调用adler函数,但是在vs2008下却报错。
    我在解决这个问题时走了不少弯路,所以在此总结一下。

    首先,确保工程类型正确
    一般选择win32类的windows类型时,程序里面的主函数应该是_WinMain函数;如果程序里的主函数是main,那就应该选择console类型。如果类型错误,会报一些链接错误,比如LNK2019、2005、2001等,有时候你解决这个那个错误又有了,甚至这几个错误循环出现.

    第二,下载zlib源码,进行编译
    如果工程类型没有问题,你就可以下载zlib源码了,有了源码我们才可以编译出自己需要的.lib文件,另外zlib.h文件也在源码中。下载地址为
http://www.winimage.com/zLibDll/index.html。我下载的zlib125.zip。
    然后解压缩到你想要的位置(此处以d:\zlib-1.2.5为例)。解压缩后的文件夹下含有很多子目录和源文件,其中win32子目录中的Makefile.msc就是在windows下采用微软编译器制定的make文件。打开该文件可以看到四种编译方法:
# Usage:
#   nmake -f win32/Makefile.msc                          (standard build)
#   nmake -f win32/Makefile.msc LOC=-DFOO                (nonstandard build)
#   nmake -f win32/Makefile.msc LOC="-DASMV -DASMINF" \
#         OBJA="inffas32.obj match686.obj"               (use ASM code, x86)
#   nmake -f win32/Makefile.msc AS=ml64 LOC="-DASMV -DASMINF" \
#         OBJA="inffasx64.obj gvmat64.obj inffas8664.c"  (use ASM code, x64)
    其中第四种是针对64位机器的,由于我用的32位,所以第四种没有使用。
    编译时需要注意两点
    第一、nmake指令需要在“Visual Studio 2008 Command Prompt"下使用,以使VS2008相关系统参数正确设置
    第二、执行路径在源文件的路径。比如d:\zlib-1.2.5>nmake -f win32/Makefile.msc。我当时进入了win32文件夹下执行的,没发现,害的我浪费了好多时间查找问题。
    编译后可能会报错,比如:
infback.obj : error LNK2019: unresolved external symbol _inflate_fast referenced in function _inflateBack
inflate.obj : error LNK2001: unresolved external symbol _inflate_fast
zlib1.dll : fatal error LNK1120: 1 unresolved externals
    就是找不到inffas32.obj,原因是makefile文件中没有inffas32.obj的信息。解决方法为打开Makefile.msc文件,然后在

OBJS = adler32.obj compress.obj crc32.obj deflate.obj gzclose.obj gzlib.obj gzread.obj \

       gzwrite.obj infback.obj inflate.obj inftrees.obj trees.obj uncompr.obj zutil.obj
的后面添加inffast.obj的信息,结果为
OBJS = adler32.obj compress.obj crc32.obj deflate.obj gzclose.obj gzlib.obj gzread.obj \

       gzwrite.obj infback.obj inflate.obj inftrees.obj trees.obj uncompr.obj zutil.obj \

      inffast.obj
    保存后执行上述编译指令即可。

    第三、将包含文件和库文件添加到工程中
    将zlib.h文件和lib库文件添加到工程中后,就可使用adler32函数了。

    头文件配置方法:项目右键->属性->配置属性->C/C++->附加包含目录,添加相应路径。比如zlib.h在d:\zlib-1.2.5下,则路径到d:\zlib-1.2.5即可。
    lib文件配置方法:首先,项目右键->属性->配置属性->链接器->常规->附加库目录,加入链接库的路径,同头文件类似。然后再调用adler32的文件中添加lib信息如#pragma comment(lib,"zlib.lib"),或者项目右键->属性->配置属性->链接器->输入->附加依赖中加入相应lib

     至此设置完毕,可以正常使用了