ZLib Compile and Usage
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