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函数学习之PHP函数点评
Jul 05 PHP
解决File size limit exceeded 错误的方法
Jun 14 PHP
ThinkPHP的cookie和session冲突造成Cookie不能使用的解决方法
Jul 01 PHP
php+xml编程之xpath的应用实例
Jan 24 PHP
php替换字符串中间字符为省略号的方法
May 04 PHP
php使用Jpgraph绘制饼状图的方法
Jun 10 PHP
PHP制作用户注册系统
Oct 23 PHP
PHP 在数组中搜索给定的简单实例 array_search 函数
Jun 13 PHP
PHP实现导出带样式的Excel
Aug 28 PHP
PHP十六进制颜色随机生成器功能示例
Jul 24 PHP
PHP面向对象中new self()与 new static()的区别浅析
Aug 17 PHP
PHP并发场景的三种解决方案代码实例
Feb 27 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
MySQL连接数超过限制的解决方法
2011/07/17 PHP
刷新PHP缓冲区为你的站点加速
2015/10/10 PHP
Zend Framework教程之Resource Autoloading用法实例
2016/03/08 PHP
JS特殊函数(Function()构造函数、函数直接量)区别介绍
2013/05/19 Javascript
js脚本实现数据去重
2014/11/27 Javascript
javascript定时器完整实例
2015/02/10 Javascript
js实现图片放大和拖拽特效代码分享
2015/09/05 Javascript
javascript实现根据汉字获取简拼
2016/09/25 Javascript
canvas学习之API整理笔记(一)
2016/12/29 Javascript
JS变量中有var定义和无var定义的区别以及es6中let命令和const命令
2017/02/19 Javascript
详解vue 配合vue-resource调用接口获取数据
2017/06/22 Javascript
jQuery第一次运行页面默认触发点击事件的实例
2018/01/10 jQuery
react 组件传值的三种方法
2019/06/03 Javascript
Python实现简单http服务器
2018/04/12 Python
对python中for、if、while的区别与比较方法
2018/06/25 Python
python异步存储数据详解
2019/03/19 Python
学习和使用python的13个理由
2019/07/30 Python
Django缓存系统实现过程解析
2019/08/02 Python
详解centos7+django+python3+mysql+阿里云部署项目全流程
2019/11/15 Python
在keras中model.fit_generator()和model.fit()的区别说明
2020/06/17 Python
GLAMGLOW格莱魅美国官网:美国知名的面膜品牌
2016/12/31 全球购物
娇韵诗加拿大官网:Clarins加拿大
2017/11/20 全球购物
Traffic People官网:女式花裙、上衣和连身裤
2020/10/12 全球购物
婚礼证婚人证婚词
2014/01/13 职场文书
计算机专业职业生涯规划范文
2014/01/19 职场文书
青年教师培训方案
2014/02/06 职场文书
卫生厅领导班子党的群众路线教育实践活动整改措施
2014/09/20 职场文书
毕业证代领委托书
2014/09/26 职场文书
政风行风整改报告
2014/11/06 职场文书
2015年母亲节寄语
2015/03/23 职场文书
网络销售员岗位职责
2015/04/11 职场文书
政府会议通知范文
2015/04/15 职场文书
学校教学管理制度
2015/08/06 职场文书
Html5生成验证码的示例代码
2021/05/10 Javascript
MySQL中的布尔值,怎么存储false或true
2021/06/04 MySQL
python中pymysql包操作数据库方法
2022/04/19 Python