Windows下编译PHP5.4和xdebug全记录


Posted in PHP onApril 03, 2015

实际上我最终目的是编译得到支持 PHP5.4 的 php_xdebug.dll,而在此之前,成功编译 PHP5.4 是必须的。

编译环境以及相关软件包:
1.Microsoft Visual C++ 2008 Express Edition with SP1
2.Windows SDK 6.1
3.PHP SDK Binary Tools
4.Dependable libs
5.PHP5.4 Sources
6.Xdebug 2.2.0-dev
如果你需要的是 VC6 的编译环境,那么你需要安装 Visual C++ 6.0,而 SDK 则需要换成:
Windows Server 2003 PSDK

编译过程:

准备好咖啡、可乐,做好准备,可能要折腾数小时…

安装 VC++ 2008 以及 Windows SDK 6.1

建立如下目录:

D:\php-sdk

D:\php-sdk\php54dev

D:\php-sdk\pecl

解压 php-sdk-binary-tools-20110915.zip 中的所有文件至 D:\php-sdk
提取 deps-5.4-vc9-x86.7z 中的 deps 目录至 D:\php-sdk\php54dev
解压 php5.4 源码至 D:\php-sdk\php54dev,目录名任取,比如 php-5.4.0RC3
xdebug 的源码放到 D:\php-sdk\pecl\xdebug

最终的目录结构大概是这样子的:

D:\php-sdk>tree D:\php-sdk

Folder PATH listing for volume DISK_VOL2

Volume serial number is 0C74-AD73

D:\PHP-SDK

├───bin

├───php54dev

│   ├───deps

│   │   ├───bin

│   │   ├───include

│   │   ├───lib

│   │   └───sybase

│   ├───pecl

│   │   └───xdebug

│   └───php-5.4.0RC3

├───script

└───share

打开 Windows SDK CMD Shell,执行:setenv /x86 /xp /release,如果你是64位系统,那么这个命令是必须的,不要试图把参数改成 /x64,否则后续的 make 阶段,你会看到成千上万条 WARNING …

设定 PATH:set PATH=D:\php-sdk\bin;%PATH%

切换 SHELL 目录至 D:\php-sdk\php54dev\php-5.4.0RC3>,执行 buildconf 生成 configure 脚本:

D:\php-sdk\php54dev\php-5.4.0RC3>buildconf

Rebuilding configure.js

Now run 'configure --help'

D:\php-sdk\php54dev\php-5.4.0RC3>

执行 configure 生成 Make 脚本,可以查看 configure ?help 以获取更多编译选项:
D:\php-sdk\php54dev\php-5.4.0RC3>configure --disable-snapshot-build --disable-debug-pack --disable-ipv6 --disable-zts --disable-isapi --disable-nsapi --without-t1lib --without-mssql --without-pdo-mssql --without-pi3web --without-enchant --enable-com-dotnet --with-mcrypt=static --disable-static-analyze --with-xdebug=shared

这里我使用了 ?disable-snapshot-build 关掉了 snapshot 模式,因为这个命令会强制开启许多对我来说无用的选项,比如 aolserver,apache sapi 之类的,最后我加上了 ?with-xdebug=shared,在使用这个选项之前最好确认 xdebug 源码的位置正确,如果没什么问题的话,buildconf 之后,在 configure ?help 中你可以看到这个选项,shared 表示编译成动态链接库。

如果你要编译其它的 pecl 扩展(比如 apc,bcompiler 等),只需要相关的源码下载放到 pecl 目录,重新执行 buildconf 即可。

若 configure 无问题,最后执行 nmake 开始编译过程,Good Luck! :)

最后一步 nmake snap,组织所有编译好的文件的目录结构(也就是你平时下载的 PHP 二进制包的结构),并用 zip 打包。

最终生成的文件位置:D:\php-sdk\php54dev\php-5.4.0RC3\Release(_TS)

错误处理:
nmake 过程中会产生很多的 Warning,只要不中断,那么就无视好了。

关于 calendar.c 和 jewish.c 的编码问题:

ext\calendar\calendar.c : warning C4819: The file contains a character that cannot be represented in the current code page (936). Save the file in Unicode format to prevent data loss

dow.c

easter.c

french.c

gregor.c

jewish.c

ext\calendar\jewish.c : warning C4819: The file contains a character that cannot be represented in the current code page (936). Save the file in Unicode format to prevent data loss

ext\calendar\jewish.c(324) : error C2001: newline in constant

ext\calendar\jewish.c(325) : error C2001: newline in constant

ext\calendar\jewish.c(326) : error C2001: newline in constant

ext\calendar\jewish.c(327) : error C2001: newline in constant

NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\Bin\cl.exe"' : return code '0x2'

Stop.

这两个文件使用的是 ANSI 编码,包含有一些西文的特殊字符,GBK 字符集中不存在。
可用 editplus 打开,编码选择:West European (Windows),另存为 UTF-8。
PHP 相关文章推荐
PHP中的串行化变量和序列化对象
Sep 05 PHP
对盗链说再见...
Oct 09 PHP
可定制的PHP缩略图生成程式(需要GD库支持)
Mar 06 PHP
php对csv文件的读取,写入,输出下载操作详解
Aug 10 PHP
php操作xml
Oct 27 PHP
PHP连接MSSQL时nvarchar字段长度被截断为255的解决方法
Dec 25 PHP
PHP+MySQL修改记录的方法
Jan 21 PHP
php实现parent调用父类的构造方法与被覆写的方法
Feb 11 PHP
PHP图像处理类库MagickWand用法实例分析
May 21 PHP
php时间计算相关问题小结
May 09 PHP
浅谈PHP正则中的捕获组与非捕获组
Jul 18 PHP
Laravel5.1 框架数据库操作DB运行原生SQL的方法分析
Jan 07 PHP
Centos下升级php5.2到php5.4全记录(编译安装)
Apr 03 #PHP
php实现在限定区域里自动调整字体大小的类实例
Apr 02 #PHP
php实现专业获取网站SEO信息类实例
Apr 02 #PHP
php获得网站访问统计信息类Compete API用法实例
Apr 02 #PHP
php实现从上传文件创建缩略图的方法
Apr 02 #PHP
php调用KyotoTycoon简单实例
Apr 02 #PHP
PHP中数据类型转换的三种方式
Apr 02 #PHP
You might like
php中文字母数字验证码实现代码
2008/04/25 PHP
PHP以mysqli方式连接类完整代码实例
2014/07/15 PHP
Javascript !!的作用
2008/12/04 Javascript
在网页中使用document.write时遭遇的奇怪问题
2010/08/24 Javascript
onsubmit阻止form表单提交与onclick的相关操作
2010/09/03 Javascript
HTML Dom与Css控制方法
2010/10/25 Javascript
jQuery EasyUI API 中文文档 - Parser 解析器
2011/09/29 Javascript
javascript 实现简单的table排序及table操作练习
2012/12/28 Javascript
基于jQuery中对数组进行操作的方法
2013/04/16 Javascript
js中replace的用法总结
2013/12/27 Javascript
JavaScript中实现map功能代码分享
2015/06/11 Javascript
Node.js 文件夹目录结构创建实例代码
2016/07/08 Javascript
JavaScript的==运算详解
2016/07/20 Javascript
简单理解vue中track-by属性
2016/10/26 Javascript
浅谈vue的踩坑路
2017/08/31 Javascript
vue添加自定义右键菜单的完整实例
2020/12/08 Vue.js
[00:03]DOTA2新版本PA至宝展示
2014/11/19 DOTA
[01:20:47]DOTA2-DPC中国联赛 正赛 Ehome vs Magma BO3 第一场 1月19日
2021/03/11 DOTA
Python全局变量操作详解
2015/04/14 Python
Pycharm远程调试原理及具体配置详解
2019/08/08 Python
在python中使用pymysql往mysql数据库中插入(insert)数据实例
2020/03/02 Python
Python+OpenCV实现图像的全景拼接
2020/03/05 Python
Python基于yaml文件配置logging日志过程解析
2020/06/23 Python
python 爬取英雄联盟皮肤并下载的示例
2020/12/04 Python
微软中国官方商城:Microsoft Store中国
2018/10/12 全球购物
struct和class的区别
2015/11/20 面试题
医科大学生的自我评价
2013/12/04 职场文书
爸爸的花儿落了教学反思
2014/02/20 职场文书
益达广告词
2014/03/14 职场文书
党员创先争优公开承诺书
2014/03/28 职场文书
爱情寄语大全
2014/04/09 职场文书
2014年小学生迎国庆65周年演讲稿
2014/09/27 职场文书
学生党员检讨书范文
2014/12/27 职场文书
开除员工通知
2015/04/22 职场文书
肖申克的救赎观后感
2015/06/02 职场文书
让文件路径提取变得更简单的Python Path库
2021/05/27 Python