WIN7下VS2008下编译PHP扩展的6个细节

1、编译生成的dll文件无法加载的问题
此时apache启动时可能会报如下错误:
PHP Warning: PHP Startup: Invalid library (maybe not a PHP library) ‘php_martin.dll’ in Unknown on line 0
原因:get_module在动态链接库中不对外开放
修改:在vs2008的项目属性,选择【Configuration Properties】-> 【C/C++】-> 【Preprocessor】-> 【Preprocessor Definitions】增加(COMPILE_DL_MARTIN)宏定义
查看方式:进入vs2008的命令行模式,进入dll所在文件夹,输入命令:dumpbin /exports php_martin.dll
查看是否提供了get_module函数
以上的martin需换成你自己的扩展名

2、LNK2001: unresolved external symbol _ZVAL_ADDREF问题
在之前的文章PHP5.3版本编译扩展时出现:LNK2001: unresolved external symbol _ZVAL_ADDREF
有提到解决方案,只是这样是将新的接口转换成旧的接口,这对于无法修改的旧代码可以适用,但是对于新的代码,我们建议在旧版本的时候使用Z_ADDREF_P将ZVAL_ADDREF替换,如下所示代码:

1
2
3
#ifndef Z_ADDREF_P
#define Z_ADDREF_P(x) ZVAL_ADDREF(x)
#endif

感谢鸟哥的指导

3、对于在被其它c文件include的c文件,在进行编译操作时需要将其从项目中排除掉。

4、Runtime Library
在编译时如遇到显示如下错误时:

1
2
3
4
5
Error	229	error LNK2019: unresolved external symbol __imp___free_dbg referenced in function
 
Error	230	error LNK2019: unresolved external symbol __imp___malloc_dbg referenced in function 
 
Error	231	error LNK2019: unresolved external symbol __imp___strdup_dbg referenced in function

LNK2019: unresolved external symbol __imp___free_dbg referenced
在vs2008的项目属性,选择【Configuration Properties】-> 【C/C++】-> 【Code Generation】-> 【Runtime Library】,将其改为/MDd,而不是/MD

5、32位,64位问题
如有报错:Error 137 error C2466: cannot allocate an array of constant size 0
这可能是VS2008 默认使用 64 位的 time_t 结构
建议在命令中添加:/D “_USE_32BIT_TIME_T=1″

6、对于不同版本的dll编译,除了对应版本的源码外,所需要的php5ts.lib文件也要使用其相对应版本
否则会在链接时报LNK2019错误,如:
error LNK2019: unresolved external symbol __imp__zend_str_tolower_dup referenced in function
error LNK2019: unresolved external symbol __imp__gc_remove_zval_from_buffer referenced in function

–EOF–

发表评论

电子邮件地址不会被公开。 必填项已用*标注


*

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>