开发环境:MinGW,即Windows下的GNU环境(系统是Windows同时编译工具是make,gcc等)。
从zlib主页下载源码和编译好的dll。
zlib Home Site
zlib128.zip
zlib128-dll.zip
库发布的源码中附带了minizip工具的源码:
直接编译时提示找不到libz.a库
zip\zlib-1.2.8\contrib\minizip>make
make: *** No rule to make target '../../libz.a', needed by 'miniunz'. Stop.
进入库目录尝试编译生成库:
zip\zlib-1.2.8\contrib\minizip>pushd ..\..
zip\zlib-1.2.8>make
Please use ./configure first. Thank you.
zip\zlib-1.2.8>configure
'configure' 不是内部或外部命令,也不是可运行的程序或批处理文件。
DOS不能执行 configure 脚本,怎么办?
直接使用编译好的库:
在zlib128-dll.zip\USAGE.txt中 "Using ZLIB1.DLL with gcc/MinGW" 小节有如下说明
cp lib/zdll.lib lib/libzdll.a
这里需要的库名是 libz.a,相对 minizip的位置是 ..\..。
现在zlib库有了,继续编译minizip。又遇到链接错误
zip\zlib-1.2.8\contrib\minizip>make
cc -O -I../.. -o miniunz miniunz.o unzip.o ioapi.o ../../libz.a
miniunz.o:miniunz.c:(.text+0xbd1): undefined reference to `fill_win32_filefunc64
A'
原因:zlib为了跨平台,在代码上识别了系统,即根据是否定义了 _WIN32、unix 等宏来调用不同的(系统)函数。但minizip没有考虑 MinGW,所以编译出错。
处理:在minizip.c和miniunz.c前面加如下代码
// FOR MinGW
#define unix 1
#ifdef _WIN32
#undef _WIN32
#endif
#ifdef WIN32
#undef WIN32
#endif
继续编译minizip,又遇到错误
miniunz.c: In function 'mymkdir':
miniunz.c:143:5: error: too many arguments to function 'mkdir'
原因:__linux__与MinGW在mkdir实现上有区别,详见
解决:
在miniunzip.c中添加如下宏尝试解决
#define mkdir(name,mode) _mkdir (name)
此法行不通,编译出错:
c:\mingw\bin\../lib/gcc/mingw32/4.7.2/../../../../include/io.h:311:55: error: macro "mkdir" requires 2 arguments, but only 1 given
正确的解决方法是改代码
// ret = mkdir (dirname,0775); // unix
ret = _mkdir(dirname);// __MINGW32__
继续编译,通过。
执行 make test 测试,通过。
下一步,找zip相关资料,读minizip代码!
阅读(4120) | 评论(0) | 转发(0) |