编写PHP5.3.0扩展遇到的问题

    最近需要为数据库开发一个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就可以了。

 

     至此,大功告成。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值