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 相关文章推荐
模板引擎Smarty深入浅出介绍
Dec 06 PHP
PHP extract 将数组拆分成多个变量的函数
Jun 30 PHP
php中使用Akismet防止垃圾评论的代码
Jun 10 PHP
PHP静态文件生成类实例
Nov 29 PHP
php代码架构的八点注意事项
Jan 25 PHP
Thinkphp 5.0实现微信企业付款到零钱
Sep 30 PHP
Laravel 队列使用的实现
Jan 08 PHP
PHP抽象类与接口的区别实例详解
May 09 PHP
tp5框架基于Ajax实现列表无刷新排序功能示例
Feb 10 PHP
tp5框架前台无限极导航菜单类实现方法分析
Mar 29 PHP
php判断数组是否为空的实例方法
May 10 PHP
PHP实现腾讯短网址生成api接口实例
Dec 08 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编码规范-php coding standard
2007/03/16 PHP
PHP中Date获取时间不正确怎么办
2008/06/05 PHP
彻底杜绝PHP的session cookie错误
2009/08/09 PHP
php中使用cookie来保存用户登录信息的实现代码
2012/03/08 PHP
php简单随机字符串生成方法示例
2017/04/19 PHP
Lumen timezone 时区设置方法(慢了8个小时)
2018/01/20 PHP
原生js实现淘宝首页点击按钮缓慢回到顶部效果
2014/04/06 Javascript
jQuery使用$.ajax提交表单完整实例
2015/12/11 Javascript
JQuery EasyUI学习教程之datagrid 添加、修改、删除操作
2016/07/09 Javascript
JS求解三元一次方程组值的方法
2017/01/03 Javascript
Avalonjs 实现简单购物车功能(实例代码)
2017/02/07 Javascript
JS字符串按逗号和回车分隔的方法
2017/04/25 Javascript
vue.js国际化 vue-i18n插件的使用详解
2017/07/07 Javascript
关于jquery form表单序列化的注意事项详解
2017/08/01 jQuery
微信小程序 页面滑动事件的实例详解
2017/10/12 Javascript
js实现手机web图片左右滑动效果
2017/12/29 Javascript
bootstrap与pagehelper实现分页效果
2018/12/29 Javascript
vue自定义键盘信息、监听数据变化的方法示例【基于vm.$watch】
2019/03/16 Javascript
微信小程序API—获取定位的详解
2019/04/30 Javascript
jQuery实现弹幕特效
2019/11/29 jQuery
Javascript模块化机制实现原理详解
2020/04/02 Javascript
Python脚本判断 Linux 是否运行在虚拟机上
2015/04/25 Python
利用Python开发实现简单的记事本
2016/11/15 Python
微信跳一跳辅助python代码实现
2018/01/05 Python
python中ASCII码字符与int之间的转换方法
2018/07/09 Python
Python发送邮件功能示例【使用QQ邮箱】
2018/12/04 Python
Python3.5内置模块之shelve模块、xml模块、configparser模块、hashlib、hmac模块用法分析
2019/04/27 Python
python 实现字符串下标的输出功能
2020/02/13 Python
特罗佩亚包官方网站:Tropea
2017/01/03 全球购物
STUBHUB日本:购买和出售全球活动门票
2018/07/01 全球购物
美国正宗设计师眼镜在线零售商:EYEZZ
2019/03/23 全球购物
英语文学专业学生的自我评价
2013/10/31 职场文书
拓展策划方案
2014/06/03 职场文书
村级四风对照检查材料
2014/08/24 职场文书
校园安全广播稿范文
2014/09/25 职场文书
教师外出学习心得体会
2016/01/18 职场文书