PHP5.3版本编译扩展时出现的问题
近,因要编译PHP扩展,本着最新最好的出发点,将PHP5.3的源码包下载下来,并将扩展源码创建VS2008项目,在经历百般磨难后,终于不再出现语法错误,然而当满怀希望按下F7键后,发现出现了N多的LNK2001和LNK2019错误,其中error LNK2001巨多,在纠结了一个周末后,可能是感动上天,终于在GOOGLE中找到了答案。
报错如下:
error LNK2001: unresolved external symbol _ZVAL_ADDREF
GOOGLE给的答案是php5.3以上版本更改了一些Zend API,而ZVAL_ADDREF刚好是其中的一个。
如下为解决方案:
假设我们的扩展为martin,则在php_martin.h或martin文件中,在include了相关php本身的头文件后添加如下 代码:
1 2 3 4 5 6 7 8 9 | #if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION >= 3) || (PHP_MAJOR_VERSION >= 6) #undef ZVAL_REFCOUNT #undef ZVAL_ADDREF #undef ZVAL_DELREF #define ZVAL_REFCOUNT Z_REFCOUNT_P #define ZVAL_ADDREF Z_ADDREF_P #define ZVAL_DELREF Z_DELREF_P #endif |
以上代码的作用是将新的宏以旧名重定义,以保持其可用性。
【参考资料】
http://www.hightman.cn/bbs/showthread.php?tid=656
http://d.hatena.ne.jp/rsky/20071016/1192524940
做个小标记。
Pingback引用通告: WIN7下VS2008下编译PHP扩展的4个细节 | PHP源码阅读,PHP设计模式,PHP学习笔记-胖子的空间