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的正则处理函数总结分析
Jun 20 PHP
php+AJAX传送中文会导致乱码的问题的解决方法
Sep 08 PHP
php 远程关机操作的代码
Dec 05 PHP
POSIX 风格和兼容 Perl 风格两种正则表达式主要函数的类比(preg_match, preg_replace, ereg, ereg_replace)
Oct 12 PHP
zend Framework中的Layout(模块化得布局)详解
Jun 28 PHP
PHP计算2点经纬度之间的距离代码
Aug 12 PHP
Eclipse的PHP插件PHPEclipse安装和使用
Jul 20 PHP
php中fgetcsv()函数用法实例
Nov 28 PHP
php使用unset()删除数组中某个单元(键)的方法
Feb 17 PHP
php语言的7种基本的排序方法
Dec 28 PHP
PHP示例演示发送邮件给某个邮箱
Apr 03 PHP
tp5框架基于Ajax实现列表无刷新排序功能示例
Feb 10 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面向对象全攻略 (二) 实例化对象 使用对象成员
2009/09/30 PHP
php array_filter除去数组中的空字符元素
2020/06/21 PHP
通过PHP修改Linux或Unix口令的方法分享
2012/01/30 PHP
PHP编程函数安全篇
2013/01/08 PHP
php模仿asp Application对象在线人数统计实现方法
2015/01/04 PHP
PHP合并两个或多个数组的方法
2019/01/20 PHP
基于jquery实现的一个选择中国大学的弹框 (数据、步骤、代码)
2012/07/26 Javascript
JS对select控件option选项的增删改查示例代码
2013/10/21 Javascript
jQuery选择器全面总结
2014/01/06 Javascript
JQuery调用绑定click事件的3种写法
2015/03/28 Javascript
JS实现黑色风格的网页TAB选项卡效果代码
2015/10/09 Javascript
js 自带的sort() 方法全面了解
2016/08/16 Javascript
一步一步封装自己的HtmlHelper组件BootstrapHelper(三)
2016/09/14 Javascript
Javascript中的getter和setter初识
2017/08/17 Javascript
jQuery实现的简单前端搜索功能示例
2017/10/28 jQuery
vue.js获得当前元素的文字信息方法
2018/03/09 Javascript
Chart.js 轻量级HTML5图表绘制工具库(知识整理)
2018/05/22 Javascript
nodejs 十六进制字符串型数据与btye型数据相互转换
2018/07/30 NodeJs
Vue.js实现开发购物车功能的方法详解
2019/02/22 Javascript
JS代码触发事件代码实例
2020/01/02 Javascript
vue中重定向redirect:‘/index‘,不显示问题、跳转出错的完美解决
2020/09/28 Javascript
Vue中使用Echarts仪表盘展示实时数据的实现
2020/11/01 Javascript
Tensorflow中使用tfrecord方式读取数据的方法
2018/06/19 Python
python golang中grpc 使用示例代码详解
2020/06/03 Python
Python根据字符串调用函数过程解析
2020/11/05 Python
Etam德国:内衣精品店
2019/08/25 全球购物
最好的商品表达自己:Cafepress
2019/09/04 全球购物
《动手做做看》教学反思
2014/04/09 职场文书
社会学专业求职信
2014/07/17 职场文书
2014年民政工作总结
2014/11/26 职场文书
护理工作个人总结
2015/03/03 职场文书
民事起诉状范文
2015/05/19 职场文书
可怜妈妈观后感
2015/06/09 职场文书
贫困生证明范文
2015/06/16 职场文书
2016十一国庆节慰问信
2015/12/01 职场文书
Redis实现订单自动过期功能的示例代码
2021/05/08 Redis