在windows系统下用VC6编译最新版PHP5.3.3扩展(以vld为例)

     前言:本文以编译PHP的vld扩展为例来叙述如何在windows系统下使用VC(那个CYGWIN有点蛋疼)编译最新版PHP5.3.3,要编译完整的PHP代码包,则大同小异.
关键词:PHP5.3.3,PHP扩展开发,编译PHP
开始了:
环境:VC6.0,windowsXP ,PHP5.3.3

(1)下载PHP5.3.3的源代码包(http://www.php.net/)以及vld扩展源代码(http://pecl.php.net/package/vld/)。
解压,我的是解压在D盘根目录下,路径即为d:\php-5.3.3,把vld的源代码复制到\ext\vld目录下。

(2)在Windows平台启动 VC++ 6.0, 【文件】(File)->【新建】(New), 在 【工程】(Project)中选择 【Win32 Dynamic-Link Library】, 填写上 【工程名称】(Project Name) 和 【位置】(Location)。

(3)点击确定后,在第二屏选中 【一个空的DLL工程】(An empty DLL project), 点 【完成】Finish, 完成创建。此时会可能会弹出一个信息框,点击确定。

(4)选择左侧的【Source Files】,点击右键,选择【添加文件到目录】,将D:\php-5.3.3\ext\vld目录下的所有C文件添加到此目录,同样选择【Header Files】,添加所有的头文件到目录。
vld_set_source.jpg

(5)修改工程设置,选择【工程】(Project)->【设置】(Settings)->【C/C++】,在【工程选项】(Project Options:)的 最后加上 /Tc,在预处理程序定义中添加如下宏定义:
ZEND_DEBUG=0,COMPILE_DL_VLD,ZTS=1,ZEND_WIN32,PHP_WIN32,HAVE_VLD=1
如果你需要编译其它扩展,请将COMPILE_DL_VLD 和 HAVE_VLD=1,后面的 “VLD” 改成和你要创建的工程名一致。

project_set.jpg

(6)、选择【连接】(Link),在【对象/库模块】(Object/library modules)添加php5ts.lib.

(7)、选择【工具】(Tools)->【选项】(Options)->【目录】(Directories),
在 【目录】(Show directories for:) 下拉框中选择 “Library files”,在 【路径】
(Directories) 中添加 D:\php-5.3.3 (即 php5ts.lib 所在目录)
在【目录】(Show directories for:) 下拉框中选择 “Include files”
在【路径】(Directories)中添加 D:\PHP-5.3.3 (即 ext、regex、win32 所在目录)
在【路径】(Directories)中添加 D:\PHP-5.3.3\MAIN
在【路径】(Directories)中添加D:\PHP-5.3.3\ZEND
在【路径】(Directories)中添加 D:\PHP-5.3.3\TSRM

(8)、选择【组建】->【组建】,此时可能会出现报错。
在php_vld.h文件的59行的函数参数列表里存在三个莫名其妙的点,将它们去掉就可以了。你懂的。

(9).继续组建,又报错了,还一大堆,还有警告一大把。警告不管,报错一看,是
Cannot open include file: '../main/config.w32.h',提示找不到文件,到main目录下一看,果然没有这个文件。是我下的源代码错了吗?不是的,是你不懂C。

(10)到根目录执行configure.bat文件,我擦,没反应,main目录下还是没生成这个文件。

(11)继续折腾。先下载2个必要的包
http://www.php.net/extra/bindlib_w32.zip
http://www.php.net/extra/win32build.zip
把这2个包的内容放一起,我都解压缩到D:\win32build
然后执行buildconf.bat
提示:
Rebuilding configure.js
Now run 'cscript /nologo configure.js --help'
接下来要临时设置一下环境变量,不然会提示找不到bison.exe:
Checking for bison.exe ... <not found>
ERROR: bison is required
命令行输入:set path=%path%;D:\win32build\bin
执行:cscript /nologo configure.js --with-php-build="../win32build" --without-libxml  --disable-odbc
上面的参数务必补齐,不然出现一些错误也麻烦。详细的我就不说了。会删除一大串字符,等到
出现
Creating build dirs...
Generating files...
Generating Makefile
Generating main/internal_functions.c
Generating main/config.w32.h
Done.
说明build也就成功了。

(12)接着组建你的工程。我擦,还是不行,报错。一大堆的php_stream_transport.h error
形如
..\..\main\streams/php_stream_transport.h(85) : error C2143: syntax error : missing ')' before '*'
..\..\main\streams/php_stream_transport.h(85) : error C2081: 'socklen_t' : name in formal parameter list illegal
不用气馁,你快成功了,这是由于找不到宏报的语法错误。打开这个文件,添加typedef int socklen_t;
继续组建吧,我的孩子。

(13)再次组建吧,如果你人品没问题的话,祝福你,你成功了。

(14)在扩展下的Debug目录(D:\php-5.3.3\ext\vld\Debug)下有一个生成的dll文件。这就是我们所要的东东了!拷贝到EXT目录下,修改PHP.ini文件,你懂的。
最后,我们可以看看我的编译成功了没,执行这个扩展。
新建PHP文件
<?php
$a=array(1,3,5);
print_r($a);
命令行下执行
php -dvld.active=1 test.php

2010-11-27_105141.jpg
     再次恭喜你,你真的成功了。
(15)很佩服你这么有耐心看完我的介绍。不过还是要最后说一句,你还在用windows开发,老土。。换Linux吧,开发扩展贼方便,装逼也装的酷一点。最后再再说一句,如果你按我说的一步一步来,还是不成功的话(很有这种可能)。那你就检讨去吧。请确认你仔细看过了上面的教程。你懂的。
 本文来自:白菜博客。http://aiyooyoo.com

已有 15 条评论 »

  1. 大冬瓜 大冬瓜

    您能把那个vld的dll文件发给我吗?谢谢!

  2. 秋山澪 秋山澪

    跪求dll文件,谢谢!

    1. 已发到你邮箱里了

  3. game game

    你好,问下,可有编译过php memcached

    1. 我没有。现在网上流传的memcached的windows版本只有一个,都是从一个外国人的网站下的。
      因为这个东西在windows下的编译很困难。。。不过他网站有编译说明。你可以追根溯源区看看

  4. bobo bobo

    你好,我按你的方法成功编译了,但我使用的是nginx,一启动就提示错误,需要NTS的编译模块,请问如何设置才能编译成nts的扩展

    1. 既然是NTS,那就引入NTS的链接库php5nts.lib试试.是否还要改其他地方我也没测试过

  5. 测试成功...

  6. fournoas fournoas

    用ext_skel_win32.php生成的项目都是ts版本的,要用到php5ts.lib,我用php5.lib代替应该没关系吧

  7. fournoas fournoas

    运行“cscript /nologo configure.js --with-php-build="../win32build" --without-libxml --disable-odbc”时报错——
    C:\php-5.3.2\configure.js(4135, 1) Microsoft Jscript 运行时错误:'PHP_TEST' 未定义

    1. fournoas fournoas

      在configure.js文件开头添加:
      var PHP_TEST = "no";
      后运行成功

  8. 我用了ppc论坛上一个方法,在cmd命令行下生成的一个拓展,要手动替换好多东西……不过 还是很复杂

    1. win下确实麻烦,不过有时又离不开它,呵呵。

白菜的弟弟的同学的老师的儿子的妈妈养的小狗的表弟的主人的朋友说看帖不回会被鄙视de

添加新评论 »

【f(x,y)=(y^2-4y)(x^2-6x)的极值(请填入答案,答案见本表单title)】