最近需要为数据库开发一个php扩展,其实之前已经有旧版本的扩展源码了,只是为了兼容PHP5.3.0需要重新在新的PHP源码上编译一遍而已。 说起来也简单,但是过程中还是遇到了一些问题,花了2天时间才解决。
ps:目前只在windows下编译通过,写此文记录之。
大致步骤如下:
1. www.php.net上下载最新的PHP5.3.0源码php-5.3.0-src.zip
2. 解压源码利用ext_skel在linux下生成框架目录
3. 在VC6上建立console dll空白工程,相关设置如下:
预处理定义包括:
WIN32,NDEBUG,_WINDOWS,_MBCS,_USRDLL,DM_EXPORTS,
ZEND_DEBUG=0,ZTS,COMPILE_DL_**,HAVE_**=1,
HAVE_DBMAKER=1,ZEND_WIN32,PHP_WIN32,HAVE_ASSERT_H
lib添加:php5ts.lib dmapi.lib
use run-time library: multithreaded dll
4. 在release模式下编译,报错缺少config.w32.h头文件,在网上查了后,自己手工建了一个同名头文件放在{$php_src}/main目录
下,内容比较长,这里不能传附件就没有传上来。(问题一)
5. 编译中还碰到memcpy函数的问题,因为我的扩展中都是字符串操作,就改用了strncpy代替
6. assert重复定义问题,预处理定义添加HAVE_ASSERT_H宏后解决
7. 这个时候已经可以编译成功,在php.ini中添加该扩展名后,直接运行CLI的php.exe总是报不匹配的错误:
PHP Startup: wangxing: Unable to initialize module
Module compiled with build ID=API20090626,TS
PHP compiled with build ID=API20090626,TS,VC6
These options need to match
经过半天的搜索,终于在zend论坛找到了该问题的解决办法,在zend 论坛找到的http://forums.zend.com/viewtopic.php?f=55&t=2045
You just have to define a new preprocessor constant:
Code: Select all #define PHP_COMPILER_ID “VC6″
And put it in the upper part of PHP_Source/Zend/zend_build.h,
now you just need to recompile and you get a compatible DLL-Extension.
也就是说在zend_build.h中定义一个宏 #define PHP_COMPILER_ID “VC6″就可以了。
这个问题在VC9中也会出现,只要把定义改成VC9就可以了。
至此,大功告成。