Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1525669
  • 博文数量: 226
  • 博客积分: 3997
  • 博客等级: 少校
  • 技术积分: 2369
  • 用 户 组: 普通用户
  • 注册时间: 2010-06-19 17:26
个人简介

Never save something for a special occasion. Every day in your life is a special occasion.

文章分类

全部博文(226)

文章存档

2018年(5)

2017年(11)

2016年(1)

2015年(17)

2014年(14)

2013年(30)

2012年(5)

2011年(52)

2010年(107)

分类: 其他平台

2016-03-09 10:53:00

开发环境: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) |
给主人留下些什么吧!~~