这几天在折腾某IP包,其中带了几个小命令行工具,因为它们是Windows/Linux多平台支持,所以没提供可执行文件,只给了C源码和Makefile。
俺在CentOS下一跑make, error: 源码里自带的getline函数和stdio.h库里的同名函数冲突。这年头还有人自带getline? 于是俺简单粗暴地把getline换名为getline0. 继续make, 这回的error奇奇怪怪,大概是:
“request for member ‘xxx’ in something not a structure or union”。
俺搜了一会儿,有人说是zlib的版本不兼容导致。当前版本是1.2.7, 俺就找了台1.2.3 zlib的CentOS机器,make通过。现在有点担心这个可执行文件在1.2.7 zlib的平台上能不能工作,因为它是动态连接到libz.so的。拷过来运行,一切正常。
看来不兼容性只体现在源码层次?还是挺奇怪的。
折腾了半天,值得写个日志了。
后续:俺又花了点时间Google,基本上知道为啥了。zlib不同版本引发的兼容性问题还挺著名的,基本上是因为某些开发者错把gzFile当句柄来用了,而其实它是一个指针。不同版本的gzFile指针定义方式有些差异,新版的会在编译时直接引发错误。旧版的编译则不报错,用户可以将错就错糊弄过去。所以俺只要编译过了,新版旧版的.so都能用。如果用户一开始就把gzFile当指针用,那么不论新旧版zlib都没有问题。
gzFile ~= FILE * ;