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的一个完整SMTP类(解决邮件服务器需要验证时的问题)
Oct 09 PHP
PHP操作文件方法问答
Mar 16 PHP
介绍php设计模式中的工厂模式
Jun 12 PHP
浅析PHP微信支付通知的处理方式
May 25 PHP
php对包含html标签的字符串进行截取的函数分享
Jun 19 PHP
微信支付扫码支付php版
Jul 22 PHP
php 判断过去离现在几年的函数(实例代码)
Nov 15 PHP
thinkphp3.2实现在线留言提交验证码功能
Jul 19 PHP
thinkphp 中的volist标签在ajax操作中的特殊性(推荐)
Jan 15 PHP
PHP面向对象五大原则之里氏替换原则(LSP)详解
Apr 08 PHP
Yii2压缩PHP中模板代码的输出问题
Aug 28 PHP
thinkphp框架类库扩展操作示例
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
迅雷下载《中学科技》怀旧期刊下载
2021/02/27 无线电
2款PHP无限级分类实例代码
2015/11/11 PHP
PHP实现超简单的SSL加密解密、验证及签名的方法示例
2017/08/28 PHP
js创建数据共享接口——简化框架之间相互传值
2011/10/23 Javascript
JavaScript中常用的运算符小结
2012/01/18 Javascript
JavaScript排序算法动画演示效果的实现方法
2016/10/18 Javascript
javascript循环链表之约瑟夫环的实现方法
2017/01/16 Javascript
微信小程序 仿美团分类菜单 swiper分类菜单
2017/04/12 Javascript
vue里面父组件修改子组件样式的方法
2018/02/03 Javascript
AjaxUpLoad.js实现文件上传功能
2018/03/02 Javascript
nodeJS模块简单用法示例
2018/04/21 NodeJs
详解React Native 屏幕适配(炒鸡简单的方法)
2018/06/11 Javascript
Bootstrap table 实现树形表格联动选中联动取消功能
2019/09/30 Javascript
jQuery实现提交表单时不提交隐藏div中input的方法
2019/10/08 jQuery
通过实例了解Nodejs模块系统及require机制
2020/07/16 NodeJs
Vue 实现监听窗口关闭事件,并在窗口关闭前发送请求
2020/09/01 Javascript
[01:00:17]DOTA2-DPC中国联赛 正赛 SAG vs Dynasty BO3 第二场 1月25日
2021/03/11 DOTA
Python爬虫beautifulsoup4常用的解析方法总结
2019/02/25 Python
浅析Python 实现一个自动化翻译和替换的工具
2019/04/14 Python
获取django框架orm query执行的sql语句实现方法分析
2019/06/20 Python
django框架使用方法详解
2019/07/18 Python
python实现的汉诺塔算法示例
2019/10/23 Python
python爬虫开发之Beautiful Soup模块从安装到详细使用方法与实例
2020/03/09 Python
CSS3 简写animation
2012/05/10 HTML / CSS
详解HTML5中div和section以及article的区别
2015/07/14 HTML / CSS
HTML5实现桌面通知 提示功能
2017/10/11 HTML / CSS
HTML5中使用json对象的实例代码
2018/09/10 HTML / CSS
深深扎根运动世界的生活品牌:Tillys
2017/10/30 全球购物
RealTek面试题
2016/06/28 面试题
js正则匹配markdown里的图片标签的实现
2021/03/24 Javascript
党员思想汇报范文
2013/12/30 职场文书
《莫泊桑拜师》教学反思
2014/04/23 职场文书
红头文件任命书范本
2014/06/05 职场文书
幼儿园大班教师个人总结
2015/02/05 职场文书
车间质检员岗位职责
2015/04/08 职场文书
python 实现德洛内三角剖分的操作
2021/04/22 Python