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程序的国际化实现方法(利用gettext)
Aug 14 PHP
php数组函数序列之array_flip() 将数组键名与值对调
Nov 07 PHP
PHP的array_diff()函数在处理大数组时的效率问题
Nov 27 PHP
将博客园(cnblogs.com)数据导入到wordpress的代码
Jan 06 PHP
php 深入理解strtotime函数的使用详解
May 23 PHP
php中如何防止表单的重复提交
Aug 02 PHP
PHP图片上传代码
Nov 04 PHP
php多功能图片处理类分享(php图片缩放类)
Mar 14 PHP
PHP Hash算法:Times33算法代码实例
May 13 PHP
简单概括PHP的字符串中单引号与双引号的区别
May 07 PHP
PHP实现负载均衡session共享redis缓存操作示例
Aug 22 PHP
解决laravel groupBy 对查询结果进行分组出现的问题
Oct 09 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+MYSQL 出现乱码的解决方法
2008/08/08 PHP
PHP 抓取新浪读书频道的小说并生成txt电子书的代码
2009/12/18 PHP
解析mysql 表中的碎片产生原因以及清理
2013/06/22 PHP
php中namespace及use用法分析
2016/12/06 PHP
Yii2.0中使用js异步删除示例
2017/03/10 PHP
利用PHP判断是手机移动端还是PC端访问的函数示例
2017/12/14 PHP
IE和Firefox下javascript的兼容写法小结
2008/12/10 Javascript
jquery mobile动态添加元素之后不能正确渲染解决方法说明
2014/03/05 Javascript
JQuery获取表格数据示例代码
2014/05/26 Javascript
JQuery插件iScroll实现下拉刷新,滚动翻页特效
2014/06/22 Javascript
JavaScript实现的CRC32函数示例
2016/11/23 Javascript
js实现动态显示时间效果
2017/03/06 Javascript
AngularJS折叠菜单实现方法示例
2017/05/18 Javascript
详解如何使用webpack在vue项目中写jsx语法
2017/11/08 Javascript
JavaScript中EventLoop介绍
2018/01/22 Javascript
vue iview组件表格 render函数的使用方法详解
2018/03/15 Javascript
vue element-ui之怎么封装一个自己的组件的详解
2019/05/20 Javascript
Python中有趣在__call__函数
2015/06/21 Python
Python中%是什么意思?python中百分号如何使用?
2018/03/20 Python
python面向对象入门教程之从代码复用开始(一)
2018/12/11 Python
Python不同目录间进行模块调用的实现方法
2019/01/29 Python
Python3视频转字符动画的实例代码
2019/08/29 Python
美国厨房和园艺工具网上商店:Nestneed
2019/08/24 全球购物
如何获得EntityManager
2014/02/09 面试题
计算机相关的自我评价
2014/01/15 职场文书
个人优缺点自我评价
2014/01/27 职场文书
大学老师推荐信
2014/02/25 职场文书
2014年护理部工作总结
2014/11/14 职场文书
学校党风廉政建设调研报告
2015/01/01 职场文书
医院科室评语
2015/01/04 职场文书
放弃继承权公证书
2015/01/23 职场文书
地道战观后感2000字
2015/06/04 职场文书
运动员代表致辞
2015/07/29 职场文书
小学语文教师竞聘演讲稿范文
2019/08/09 职场文书
应届生个人的求职(自荐信范文2篇)
2019/08/23 职场文书
Python趣味挑战之实现简易版音乐播放器
2021/05/28 Python