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 反射机制实现动态代理的代码
Oct 22 PHP
PHP采用XML-RPC构造Web Service实例教程
Jul 16 PHP
smarty简单入门实例
Nov 28 PHP
PHP列出MySQL中所有数据库的方法
Mar 12 PHP
php从完整文件路径中分离文件目录和文件名的方法
Mar 13 PHP
php检查日期函数checkdate用法实例
Mar 19 PHP
php使用ZipArchive函数实现文件的压缩与解压缩
Oct 27 PHP
再推荐十款免费的php开发工具
Nov 09 PHP
php 替换文章中的图片路径,下载图片到本地服务器的方法
Feb 06 PHP
PHP微信H5支付开发实例
Jul 25 PHP
PHP检查端口是否可以被绑定的方法示例
Aug 09 PHP
php微信公众号开发之简答题
Oct 20 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编程风格规范分享
2014/01/15 PHP
实例介绍PHP的Reflection反射机制
2014/08/05 PHP
PHP数学运算函数大汇总(经典值得收藏)
2016/04/01 PHP
javascript的事件描述
2006/09/08 Javascript
javascript 尚未实现错误解决办法
2008/11/27 Javascript
jQuery1.6 使用方法二
2011/11/23 Javascript
js实现瀑布流的一种简单方法实例分享
2013/11/04 Javascript
JS上传图片前实现图片预览效果的方法
2015/03/02 Javascript
深入理解React中何时使用箭头函数
2017/08/23 Javascript
jQuery进阶实践之利用最优雅的方式如何写ajax请求
2017/12/20 jQuery
原生JS实现的碰撞检测功能示例
2018/05/18 Javascript
详解在微信小程序的JS脚本中使用Promise来优化函数处理
2019/03/06 Javascript
Vue项目使用localStorage+Vuex保存用户登录信息
2019/05/27 Javascript
Vue跨域请求问题解决方案过程解析
2020/08/07 Javascript
Python实现身份证号码解析
2015/09/01 Python
Python循环语句之break与continue的用法
2015/10/14 Python
Python中pygame的mouse鼠标事件用法实例
2015/11/11 Python
Python中如何获取类属性的列表
2016/12/26 Python
Python读取sqlite数据库文件的方法分析
2017/08/07 Python
一个可以套路别人的python小程序实例代码
2019/04/09 Python
Python实现最常见加密方式详解
2019/07/13 Python
安装Pycharm2019以及配置anconda教程的方法步骤
2019/11/11 Python
Jupyter 无法下载文件夹如何实现曲线救国
2020/04/22 Python
美国在线珠宝商店:SZUL
2017/02/11 全球购物
事业单位辞职信范文
2014/01/19 职场文书
工商治理实习生的自我评价分享
2014/02/20 职场文书
知识竞赛主持词
2014/03/26 职场文书
岗位廉政承诺书
2014/03/27 职场文书
社区平安建设方案
2014/05/25 职场文书
物资采购方案
2014/06/12 职场文书
作风转变年心得体会
2014/10/22 职场文书
民事赔偿协议书
2014/11/02 职场文书
2016新年感言
2015/08/03 职场文书
关于教师节的广播稿
2015/08/19 职场文书
Golang 编译成DLL文件的操作
2021/05/06 Golang
Win11 引入 Windows 365 云操作系统,适应疫情期间混合办公模式:启动时直接登录、模
2022/04/06 数码科技