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 09 PHP
php 获取mysql数据库信息代码
Mar 12 PHP
解决PHP在DOS命令行下却无法链接MySQL的技术笔记
Dec 29 PHP
Php中文件下载功能实现超详细流程分析
Jun 13 PHP
php.ini修改php上传文件大小限制的方法详解
Jun 17 PHP
常用PHP框架功能对照表
Oct 23 PHP
php中Socket创建与监听实现方法
Jan 05 PHP
PHP 验证登陆类分享
Mar 13 PHP
Symfony2学习笔记之模板用法详解
Mar 17 PHP
php版微信公众平台接口开发之智能回复开发教程
Sep 22 PHP
详解PHP防止直接访问.php 文件的实现方法
Jul 28 PHP
thinkphp诸多限制条件下如何getshell详解
Dec 09 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在多维数组中根据键名快速查询其父键以及父键值的代码
2011/05/07 PHP
Zend Framework教程之模型Model用法简单实例
2016/03/04 PHP
thinkphp分页集成实例
2017/07/24 PHP
jquery动态增加text元素以及删除文本内容实例代码
2013/07/01 Javascript
45个JavaScript编程注意事项、技巧大全
2015/02/11 Javascript
js插件设置innerHTML时在IE8下提示“未知运行时错误”解决方法
2015/04/25 Javascript
JavaScript中for循环的使用详解
2015/06/03 Javascript
jQuery超赞的评分插件(8款)
2015/08/20 Javascript
基于JavaScript如何实现ajax调用后台定义的方法
2015/12/29 Javascript
JS和jQuery使用submit方法无法提交表单的原因分析及解决办法
2016/05/17 Javascript
JS实现的跨浏览器解析XML文件实例
2016/06/21 Javascript
JS求解三元一次方程组值的方法
2017/01/03 Javascript
基于React实现表单数据的添加和删除详解
2017/03/14 Javascript
MUI实现上拉加载和下拉刷新效果
2017/06/30 Javascript
浅谈es6 javascript的map数据结构
2017/12/14 Javascript
Vue.js添加组件操作示例
2018/06/13 Javascript
详解vue如何使用rules对表单字段进行校验
2018/10/17 Javascript
又拍云 Node.js 实现文件上传、删除功能
2018/10/28 Javascript
angularjs1.X 重构controller 的方法小结
2019/08/15 Javascript
layui 对弹窗 form表单赋值的实现方法
2019/09/04 Javascript
使用Python保存网页上的图片或者保存页面为截图
2016/03/05 Python
python3+PyQt5实现自定义窗口部件Counters
2018/04/20 Python
python+opencv实现阈值分割
2018/12/26 Python
NumPy 基本切片和索引的具体使用方法
2019/04/24 Python
HTML5手机端弹出遮罩菜单特效代码
2016/01/27 HTML / CSS
枚举与#define宏的区别
2014/04/30 面试题
护理职业应聘自荐书
2013/09/29 职场文书
物理专业大学生职业生涯规划书
2014/02/07 职场文书
渔夫的故事教学反思
2014/02/14 职场文书
IT工程师岗位职责
2014/07/04 职场文书
争当四好少年演讲稿
2014/09/13 职场文书
2014年质量工作总结
2014/11/22 职场文书
建筑安全员岗位职责
2015/02/15 职场文书
初中政治教学工作总结
2015/08/13 职场文书
实操Python爬取觅知网素材图片示例
2021/11/27 Python
CSS巧用渐变实现高级感背景光动画
2021/12/06 HTML / CSS