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 ADODB使用方法集锦
Mar 25 PHP
PHP 采集程序中常用的函数
Dec 09 PHP
PHP Memcached应用实现代码
Feb 08 PHP
php ci框架中加载css和js文件失败的解决方法
Mar 03 PHP
php实现文本数据导入SQL SERVER
May 17 PHP
浅析PHP中Session可能会引起并发问题
Jul 23 PHP
PHP工程师VIM配置分享
Dec 15 PHP
ECSHOP完美解决Deprecated: preg_replace()报错的问题
May 17 PHP
thinkPHP简单调用函数与类库的方法
Mar 15 PHP
ThinkPHP实现转换数据库查询结果数据到对应类型的方法
Nov 16 PHP
零基础php编程好学吗
Oct 11 PHP
php操作redis数据库常见方法实例总结
Feb 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
PHP4实际应用经验篇(4)
2006/10/09 PHP
php中实现简单的ACL 完结篇
2011/09/07 PHP
超级实用的7个PHP代码片段分享
2012/01/05 PHP
php 带逗号千位符数字的处理方法
2012/01/10 PHP
php实现rc4加密算法代码
2012/04/25 PHP
PHP中file_exists()判断中文文件名无效的解决方法
2014/11/12 PHP
Jquery 基础学习笔记
2009/05/29 Javascript
JSON 数据格式介绍
2012/01/13 Javascript
Prototype源码浅析 String部分(一)之有关indexOf优化
2012/01/15 Javascript
jQuery实现id模糊查询的小例子
2013/03/19 Javascript
jQuery快速上手:写jQuery与直接写JS的区别详细解析
2013/08/26 Javascript
javascript工厂方式定义对象
2014/12/26 Javascript
JavaScript学习笔记之定时器
2015/01/22 Javascript
jQuery菜单插件superfish使用指南
2015/04/21 Javascript
JavaScript中constructor()方法的使用简介
2015/06/05 Javascript
jQuery可见性过滤器:hidden和:visibility用法实例
2015/06/24 Javascript
JQuery实现图片轮播效果
2015/09/15 Javascript
AngularJs Managing Service Dependencies详解
2016/09/02 Javascript
动态JavaScript所造成一些你不知道的危害
2016/09/25 Javascript
JSONP基础知识详解
2017/03/19 Javascript
用Vue.extend构建消息提示组件的方法实例
2017/08/08 Javascript
基于AngularJs select绑定数字类型的问题
2018/10/08 Javascript
Vue CLI 3.x 自动部署项目至服务器的方法
2019/04/02 Javascript
解决layer.confirm选择完之后消息框不消失的问题
2019/09/16 Javascript
过滤器vue.filters的使用方法实现
2019/09/18 Javascript
Python标准库defaultdict模块使用示例
2015/04/28 Python
Flask框架信号用法实例分析
2018/07/24 Python
Python中的X[:,0]、X[:,1]、X[:,:,0]、X[:,:,1]、X[:,m:n]和X[:,:,m:n]
2020/02/13 Python
Booking.com亚太地区:Booking.com APAC
2020/02/07 全球购物
重写子类方法时,抛出异常的书写注意事项
2015/10/17 面试题
党旗在我心中演讲稿
2014/09/15 职场文书
司考复习计划
2015/01/19 职场文书
幼儿园教学工作总结2015
2015/05/12 职场文书
2016全国“质量月”活动标语口号
2015/12/26 职场文书
基于Python实现流星雨效果的绘制
2022/03/18 Python
Apache Hudi集成Spark SQL操作hide表
2022/03/31 Servers