标签归档:PHP扩展编译

PHP5.3版本编译扩展时出现:LNK2001: unresolved external symbol _ZVAL_ADDREF

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