我在进行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
至此设置完毕,可以正常使用了