Compile

把zlib 1.2.8解压到zlib/zlib-1.2.8

在deflate.c文件中把deflate_copyright改成一个static变量。

在zlib目录底下创建并用Visual Studio 2008命令行运行如下bat即可生成Debug版本:

 1 @Echo off
 2 
 3 set LIBDIR=%CD%\..
 4 
 5 :: create build directory
 6 mkdir build
 7 cd build
 8 
 9 cmake -G "NMake Makefiles" ..\zlib-1.2.8 ^
10 -DCMAKE_INSTALL_PREFIX=%LIBDIR%\zlib\install ^
11 -DCMAKE_C_FLAGS_DEBUG="/D_DEBUG /MTd /Zi /Ob0 /Od /RTC1" ^
12 -DCMAKE_BUILD_TYPE=Debug
13 
14 nmake
15 nmake install
16 
17 cd ..
18 
19 mkdir elvic\lib
20 mkdir elvic\include
21 copy install\lib\zlibd.lib elvic\lib\zlibd.lib
22 copy install\lib\zlibd.lib elvic\lib\libz_d.lib
23 copy install\lib\zlibstaticd.lib elvic\lib\libz_st_d.lib
24 copy install\bin\zlibd.dll elvic\lib\zlibd.dll
25 copy install\include\*.h elvic\include\

生成Release版本请用如下bat:

 1 @Echo off
 2 
 3 set LIBDIR=%CD%\..
 4 
 5 :: create build directory
 6 mkdir build
 7 cd build
 8 
 9 cmake -G "NMake Makefiles" ..\zlib-1.2.8 ^
10 -DCMAKE_INSTALL_PREFIX=%LIBDIR%\zlib\install ^
11 -DCMAKE_C_FLAGS_RELEASE="/MT /O2 /Ob2 /D NDEBUG" ^
12 -DCMAKE_BUILD_TYPE=Release
13 
14 nmake
15 nmake install
16 
17 cd ..
18 
19 mkdir elvic\lib
20 mkdir elvic\include
21 copy install\lib\zlib.lib elvic\lib\zlib.lib
22 copy install\lib\zlib.lib elvic\lib\libz.lib
23 copy install\lib\zlibstatic.lib elvic\lib\libz_st.lib
24 copy install\bin\zlib.dll elvic\lib\zlib.dll
25 copy install\include\*.h elvic\include\

build会生成到zlib/elvic目录中。

Usage

zlib编译好后,会生成zlib.lib和zlib.dll两个文件,这正是我们需要的。

下面还是用之前的测试程序: 新建一个VC++6工程,加入如下的代码,并将zlib.dll拷贝到项目目录下:

 1 #include <stdio.h>  
 2 #include "../zlib/include/zlib.h"  
 3 #pragma comment(lib, "../zlib/lib/zlib1.lib")  
 4 #progma runtime_checks("scu",off)  
 5 int main()  
 6 {  
 7   /* 原始数据 */  
 8   unsigned char strSrc[] = "hello world! aaaaa bbbbb ccccc ddddd 中文测试 yes";  
 9   unsigned char buf[1024] = {0};  
10   unsigned char strDst[1024] = {0};  
11   unsigned long srcLen = sizeof(strSrc);  
12   unsigned long bufLen = sizeof(buf);  
13   unsigned long dstLen = sizeof(strDst);  
14   
15   printf("Src string:%s\nLength:%ld\n", strSrc, srcLen);  
16     
17   /* 压缩 */  
18   compress(buf, &bufLen, strSrc, srcLen);  
19   printf("After Compressed Length:%ld\n", bufLen);  
20   
21   /* 解压缩 */  
22   uncompress(strDst, &dstLen, buf, bufLen);  
23   printf("After UnCompressed Length:%ld\n",dstLen);  
24   
25   printf("UnCompressed String:%s\n",strDst);  
26     
27   return 0;  
28 }

和之前的程序类似,只多了#pragma comment,这里需要填入zlib.lib的正确路径

有时用VS2008调用VC6编写的DLL动态库,会出现Run-Time check Failure#0错误,网上搜索一般的解决方法都是说 __stdcall和__cdecl函数声明不一致所造成,但是,有时候,即使声明同样的函数调用方式,也还会出现RUN-TIME错误, 这是,可以试试在代码中加入#pragma runtime_checks( “scu”, off )(#pragma将vs的运行时检查全部关闭). 具体说明:link



Published

05 July 2014

Category

SHU

Tags