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 相关文章推荐
杏林同学录(二)
Oct 09 PHP
深入解析php模板技术原理【一】
Jan 10 PHP
一道关于php变量引用的面试题
Aug 08 PHP
php的array数组和使用实例简明教程(容易理解)
Mar 20 PHP
PHP开发框架laravel安装与配置教程
Mar 13 PHP
php中实现可以返回多个值的函数实例
Mar 21 PHP
在php和MySql中计算时间差的方法详解
Mar 27 PHP
PHP中strncmp()函数比较两个字符串前2个字符是否相等的方法
Jan 07 PHP
PHP Filter过滤器全面解析
Aug 09 PHP
php PDO异常处理详解
Nov 20 PHP
PHP生成图片验证码功能示例
Jan 12 PHP
php实现推荐功能的简单实例
Sep 29 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 feof用来识别文件末尾字符的方法
2010/08/01 PHP
PHP安全配置详细说明
2011/09/26 PHP
PHP函数篇详解十进制、二进制、八进制和十六进制转换函数说明
2011/12/05 PHP
php网上商城购物车设计代码分享
2012/02/15 PHP
深入解析Session是否必须依赖Cookie
2013/08/02 PHP
Thinkphp和onethink实现微信支付插件
2016/04/13 PHP
laravel ORM关联关系中的 with和whereHas用法
2019/10/16 PHP
javascript iframe中打开文件,并检测iframe存在否
2008/12/28 Javascript
IE8 下的Js错误HTML Parsing Error...
2009/08/14 Javascript
Jquery之美中不足小结
2011/02/16 Javascript
jQuery 借助插件Lavalamp实现导航条动态美化效果
2013/09/27 Javascript
javascript 获取元素样式必杀技
2014/05/04 Javascript
JavaScript参数个数可变的函数举例说明
2014/10/10 Javascript
js+css3实现旋转效果
2017/01/20 Javascript
使用ES6语法重构React代码详解
2017/05/09 Javascript
vue实现中部导航栏布局功能
2019/07/30 Javascript
Python匹配中文的正则表达式
2016/05/11 Python
python线程中同步锁详解
2018/04/27 Python
Python使用Pickle库实现读写序列操作示例
2018/06/15 Python
Python将文本去空格并保存到txt文件中的实例
2018/07/24 Python
关于python多重赋值的小问题
2019/04/17 Python
python获取地震信息 微信实时推送
2019/06/18 Python
react+django清除浏览器缓存的几种方法小结
2019/07/17 Python
如何用Python来搭建一个简单的推荐系统
2019/08/07 Python
python yield和Generator函数用法详解
2020/02/10 Python
pymysql 插入数据 转义处理方式
2020/03/02 Python
python+django+selenium搭建简易自动化测试
2020/08/19 Python
python利用platform模块获取系统信息
2020/10/09 Python
基于CSS3实现的黑色个性导航菜单效果
2015/09/14 HTML / CSS
美国内衣品牌:Leonisa
2016/08/14 全球购物
KIKO MILANO英国官网:意大利知名化妆品和护肤品品牌
2017/09/25 全球购物
美国领先的商务贺卡出版商:The Gallery Collection
2018/02/13 全球购物
大学生创业计划书怎么写
2014/09/15 职场文书
工作证明英文模板
2014/10/21 职场文书
圆明园观后感
2015/06/03 职场文书
python中os.path.join()函数实例用法
2021/05/26 Python