近期有一个用到了zlip的压缩和lua的dll需要编译到安卓平台下用,就使用SWIG做了转换,然后使用QT MinGW编译so文件.
swig转换很顺利.没有碰到什么问题,但是编译so确碰到了一些问题,网上查找相关资料也不是特别多,零零散散的,导致解决问题也不是很顺利,在此做下记录.
编译单纯得zlip的源码没啥问题,但是因为我里面用到了minizip来操作文件,它对于linux的编译就没有做很好的适配,将其的代码加入QT工程里面编译,会报如下错误:
/ioapi.c:127: error: undefined reference to 'fopen64'
/ioapi.c:157: error: undefined reference to 'ftello64'
/ioapi.c:203: error: undefined reference to 'fseeko64'
都是来自ioapi.c的三个函数,这里找不到对应的函数,在Linux里面其对应的是没有64 的函数 也就是将其加宏控制
#ifdef _WINDLL#define FOPEN_FUNC(filename, mode) fopen64(filename, mode)#define FTELLO_FUNC(stream) ftello64(stream)#define FSEEKO_FUNC(stream, offset, origin) fseeko64(stream, offset, origin)#else#define FOPEN_FUNC(filename, mode) fopen(filename, mode)#define FTELLO_FUNC(stream) ftello(stream)#define FSEEKO_FUNC(stream, offset, origin) fseeko(stream, offset, origin)#endif
这样就可以编译通过了,也不影响windows端的编译.
然后是lua5.1.4的编译,
其在llex.c 的第181的localeconv()函数会报错,找不到此函数,这个返回包含本地数字及货币信息格式的数组,具体有啥用我也还不太清楚,我将其改为NULL,
然后183行的decimal_point也会没有,在Linux里面其实就是点,所以只需改为如下:
#ifdef _WINDLL struct lconv *cv = localeconv(); char old = ls->decpoint; ls->decpoint = (cv ? cv->[0] : '.');#else struct lconv *cv = NULL; char old = ls->decpoint; ls->decpoint = '.';#endif
即可编译通过,经测试我用到的的功能也没有受到影响.
新闻热点
疑难解答