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 相关文章推荐
我常用的几个类
Oct 09 PHP
强烈推荐:php.ini中文版(1)
Oct 09 PHP
php遍历目录viewDir函数
Dec 15 PHP
Zend framework处理一个http请求的流程分析
Feb 08 PHP
PHP fopen 读取带中文URL地址的一点见解
Sep 25 PHP
PHP-redis中文文档介绍
Feb 07 PHP
php 去除html标记--strip_tags与htmlspecialchars的区别详解
Jun 26 PHP
PHP COOKIE及时生效的方法介绍
Feb 14 PHP
php函数mkdir实现递归创建层级目录
Oct 27 PHP
PHP使用SWOOLE扩展实现定时同步 MySQL 数据
Apr 09 PHP
php实现微信支付之退款功能
May 30 PHP
Laravel 微信小程序后端实现用户登录的示例代码
Nov 26 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/09/28 PHP
php Xdebug的安装与使用详解
2013/06/20 PHP
PHP 文件编程综合案例-文件上传的实现
2013/07/03 PHP
php 判断字符串中是否包含html标签
2014/02/17 PHP
Laravel框架数据库CURD操作、连贯操作总结
2014/09/03 PHP
PHP查找与搜索数组元素方法总结
2015/06/12 PHP
PHP对象实例化单例方法
2017/01/19 PHP
详解PHP防止盗链防止迅雷下载的方法
2017/04/26 PHP
浅析PHP7 的垃圾回收机制
2019/09/06 PHP
PHP array_reverse() 函数原理及实例解析
2020/07/14 PHP
swoole锁的机制代码实例讲解
2021/03/04 PHP
javascript 去字符串空格终极版(支持utf8)
2009/11/14 Javascript
jQuery 全选/反选以及单击行改变背景色实例
2013/07/02 Javascript
JS对文本框值的判断示例
2014/03/10 Javascript
js图片自动轮播代码分享(js图片轮播)
2014/05/06 Javascript
获取中文字符串的实际长度代码
2014/06/05 Javascript
chrome不支持form.submit的解决方案
2015/04/28 Javascript
three.js绘制地球、飞机与轨迹的效果示例
2017/02/28 Javascript
vue时间格式化实例代码
2017/06/13 Javascript
vuex提交state&&实时监听state数据的改变方法
2018/09/16 Javascript
vue-preview动态获取图片宽高并增加旋转功能的实现
2020/07/29 Javascript
[04:27]DOTA2官方论坛水友赛集锦
2013/09/16 DOTA
[45:59]EG vs OG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
Python列表计数及插入实例
2014/12/17 Python
Python-嵌套列表list的全面解析
2016/06/08 Python
Python 模拟购物车的实例讲解
2017/09/11 Python
Python管理Windows服务小脚本
2018/03/12 Python
如何使用Python实现自动化水军评论
2019/06/26 Python
python实现双色球随机选号
2020/01/01 Python
Python中logger日志模块详解
2020/08/04 Python
什么是java序列化,如何实现java序列化
2012/11/14 面试题
会计学财务管理专业个人的自我评价
2013/10/19 职场文书
竞选班干部演讲稿
2014/04/24 职场文书
运动会口号大全
2014/06/07 职场文书
关于爱国的标语
2014/06/24 职场文书
就业协议书样本
2014/08/20 职场文书