编译问题


Posted in PHP onOctober 09, 2006

这章节搜集了很多编译时会产生的错误情况。 1. 我用匿名CVS得到最新版的源代码包, 但没有配置脚本文件! 2. 我在配置 PHP 在 Apache下工作时出了问题。 它说不能找到 httpd.h, 可是我看它就在那里! 3. 当我运行conifgure时,它说它不能找到include文件或 一些库: GD, gdbm, 或其它的一些包! 4. 我在编译文件 language-parser.tab.c时, 出错,提示: yytname undeclared. 5. 当我运行 make, 起初正常但 最终失败了,在连接最后的应用时,出错说找不到一些文件。 6. 在连接 PHP 时, 出一堆错说 undefined references。 7. 我不清楚怎样在 Apache 1.3下编译PHP。 8. 我按照步骤一步一步安装了Apache模块(Unix下), 可是在浏览器里打开 PHP 脚本时它却问我是否要保存。 9. 系统说使用: --activate-module=src/modules/php4/libphp4.a, 可那文件根本不存在, 我只好改成 --activate-module=src/modules/php4/libmodphp4.a 好了,它不工作了! 该怎么办? 10. 我要把PHP编译成Apache的静态模块,用: --activate-module=src/modules/php4/libphp4.a 可是系统说我的编译器不是 ANSI 兼容的。 11. 我用 --with-apxs编译PHP时, 我总是得到一些奇怪的错误。 12. 在 make时, 我得到很多关于microtime错误, 还有许多 RUSAGE_ stuff. 13. 我想升级PHP,我在哪可以看到我现在运行的PHP 的当初配置安装时所使用的./configure 一行的内容? 14. 编译带GD库的PHP时,它不是给一些奇怪的错, 就是执行时产生 segfaults 段错误.
1. 我用匿名CVS得到最新版的源代码包, 但没有配置脚本文件!
你必须安装 GNU autoconf 包,这样可以从 configure.in生成配置脚本文件. 只要运行在CVS服务器得到源代码的顶级目录下的 ./buildconf。 (注意, 除非你运行configure --enable-maintainer-mode 选项, 配置脚本是不会重新生成, 即使configure.in 文件已更新, 所以当你发现 configure.in 改变了,你也要手工做一遍. 在config或config.status 运行后应该在你的Makefile里能看到象@VARIABLE@这样的标号。)
2. 我在配置 PHP 在 Apache下工作时出了问题。 它说不能找到 httpd.h, 可是我看它就在那里!
你要告诉 configure/setup 脚本 Apache 的顶级目录的位置。 就是说你要标明 --with-apache=/path/to/apache , 而不是 --with-apache=/path/to/apache/src.
3. 当我运行conifgure时,它说它不能找到include文件或 一些库: GD, gdbm, 或其它的一些包!
你可以看看 configure 脚本,那些头文件或非标准库的位置,要送一些特殊的标志给C预处理器。例如: CPPFLAGS=-I/path/to/include LDFLAGS=-L/path/to/library ./configure假如你的shell使用 csh-variant , 那么它将会是 (为什么?): env CPPFLAGS=-I/path/to/include LDFLAGS=-L/path/to/library ./configure
4. 我在编译文件 language-parser.tab.c时, 出错,提示: yytname undeclared.
你需要更新你的 Bison 版本. 你可以在 ftp://ftp.gnu.org/pub/gnu/bison/找到最新版本.
5. 当我运行 make, 起初正常但 最终失败了,在连接最后的应用时,出错说找不到一些文件。
一些老版本的 make 不能把 functions 目录下的编译的文件放到同一个目录下, 试着运行 cp *.o functions 然后再运行 make 看看是否会好些。 如果好了,你真的应该更新你的GNU Make的版本了。
6. 在连接 PHP 时, 出一堆错说 undefined references。
看看文件里的连接行,确认所有的相关包都已经正确包含。通常这样是因为缺少'-ldl',还有一些你想支持的数据库包。
如果你是在连接到 Apache 1.2.x, 你记得要在在EXTRA_LIBS 行增加一些额外的信息 并且重运行 Apache's Configure 脚本吗? 参见发行包里的 INSTALL 文件。
很多人说他们一增加 '-ldl' 马上得到了 libphp4.a 。
7. 我不清楚怎样在 Apache 1.3下编译PHP。
事实上很简单,按下面的步骤:

取得 Apache 1.3 源代码,在下面的位置 http://www.apache.org/dist/.
在某个目录下解压出来, 如 /usr/local/src/apache-1.3.
在PHP的发行包目录下,编译 PHP ,./configure --with-apache=/<path>/apache-1.3 ( 用户实际的apache-1.3目录位置替代 <path> .
打入: make 然后: make install 编译PHP,拷必须的文件到Apache目录下。
改变到你的 /<path>/apache-1.3/src 目录,编辑 Configuration文件. 把下面的行增加到文件里: AddModule modules/php4/libphp4.a.
打入: ./Configure 然后: make.
这样你就有了一个 httpd 文件!

注意:你也可以使用新的Apache ./configure 脚本. 见发行包里的 README.configure 当然也要看看PHP发行包里的 INSTALL 文件。
8. 我按照步骤一步一步安装了Apache模块(Unix下), 可是在浏览器里打开 PHP 脚本时它却问我是否要保存。
这意味着你的PHP模块没有被加载。你可从下面三点来检查:

确认你运行的Httpd是你刚刚编译了PHP的Httpd. 可以运行: /path/to/binary/httpd -l
如果你没有看到 mod_php4.c 列出来,那么你运行了不正确的Httpd. 最好重新安装它。
确认你在 Apache .conf 文件里增加了正确的Mime 类型.它应该是这样: AddType application/x-httpd-php3 .php3 ( PHP 3)
或 AddType application/x-httpd-php .php ( PHP 4)
也保证 AddType 这行没有包括在 <Virtualhost> 或 <Directory> 块里,它们会使它无效。
最后, Apache 1.2 和 Apache 1.3默认的配置文件的位置是不同的. 你应该检查你增加了AddType行的配置文件的位置 . 你可以在 httpd.conf 放一些明显的错误或改变,这样如果这文件被读的话,系统会通知你。

9. 系统说使用: --activate-module=src/modules/php4/libphp4.a, 可那文件根本不存在, 我只好改成 --activate-module=src/modules/php4/libmodphp4.a 好了,它不工作了! 该怎么办?
请注意 libphp4.a 事实并不存在. apache 进程会创建它!
10. 我要把PHP编译成Apache的静态模块,用: --activate-module=src/modules/php4/libphp4.a 可是系统说我的编译器不是 ANSI 兼容的。
这个错误消息是 Apache 误导的,可以用更新版本来修正它。
11. 我用 --with-apxs编译PHP时, 我总是得到一些奇怪的错误。
出现这样的情况可以从三点来检查. 第一, 因为某种原因,Apache 在编译apxs Perl 脚本的时候, 它没有创建适当的标志变量, 找到你的apxs脚本 (试试命令 which apxs, 通常在 /usr/local/apache/bin/apxs or /usr/sbin/apxs. 打开它找到象下面这样的行: my $CFG_CFLAGS_SHLIB  = ' ';          # substituted via Makefile.tmplmy $CFG_LD_SHLIB      = ' ';          # substituted via Makefile.tmplmy $CFG_LDFLAGS_SHLIB = ' ';          # substituted via Makefile.tmpl如果你看到的是这样,那么问题就出在这里. 因为值里包含的是空格或其它不正确的值, 如 'q()'. 把它样变成象下面的那样: my $CFG_CFLAGS_SHLIB  = '-fpic -DSHARED_MODULE'; # substituted via Makefile.tmplmy $CFG_LD_SHLIB      = 'gcc';                   # substituted via Makefile.tmplmy $CFG_LDFLAGS_SHLIB = q(-shared);              # substituted via Makefile.tmpl第二种可能仅仅出现在Red Hat 6.1 和 6.2上. apxs 脚本 Red Hat 版有错. 看这行: my $CFG_LIBEXECDIR    = 'modules';         # substituted via APACI install如果你看到了,就把它改成下面的行: my $CFG_LIBEXECDIR    = '/usr/lib/apache'; # substituted via APACI install第三, 你要是 重配置/重安装 Apache, 必须在 ./configure 后,在 make之前,执行make clean
12. 在 make时, 我得到很多关于microtime错误, 还有许多 RUSAGE_ stuff.
在安装过程中 make时,如果你看到下面的错: microtime.c: In function `php_if_getrusage':microtime.c:94: storage size of `usg' isn't knownmicrotime.c:97: `RUSAGE_SELF' undeclared (first use in this function)microtime.c:97: (Each undeclared identifier is reported only oncemicrotime.c:97: for each function it appears in.)microtime.c:103: `RUSAGE_CHILDREN' undeclared (first use in this function)make[3]: *** [microtime.lo] Error 1make[3]: Leaving directory `/home/master/php-4.0.1/ext/standard'make[2]: *** [all-recursive] Error 1make[2]: Leaving directory `/home/master/php-4.0.1/ext/standard'make[1]: *** [all-recursive] Error 1make[1]: Leaving directory `/home/master/php-4.0.1/ext'make: *** [all-recursive] Error 1
那是你的系统出错了. 你应该修复 /usr/include 文件.具体做法是安装和你的glibc匹配的glibc-devel 包. 这些错绝对和PHP无关,为了证明,你可以这样做: $ cat >test.c <<X#include <sys/resource.h>X$ gcc -E test.c >/dev/null如果出错,证明你的包含文件受损了.
13. 我想升级PHP,我在哪可以看到我现在运行的PHP 的当初配置安装时所使用的./configure 一行的内容.?
你可以看你安装PHP源目录下的 config.nice 文件. 如果不行还有另外一种方法.你只要简单运行 <?php phpinfo(); ?>脚本. 在输出页面的第一行,就是 ./configure 行, 是你当初用来配置PHP的那行.
14. 编译带GD库的PHP时,它不是给一些奇怪的错, 就是执行时产生 segfaults 段错误.
你必须确认你在编译 GD 库 和 PHP 时所使用同样的依赖库 (例如 libpng). 

PHP 相关文章推荐
php5 and xml示例
Nov 22 PHP
PHP stristr() 函数(不区分大小写的字符串查找)
Jun 03 PHP
php程序效率优化的一些策略小结
Jul 17 PHP
Codeigniter中禁止A Database Error Occurred错误提示的方法
Jun 12 PHP
ThinkPHP3.1新特性之查询条件预处理简介
Jun 19 PHP
PHP线程的内存回收问题
Jul 08 PHP
PHP获取客户端及服务器端IP的封装类
Jul 21 PHP
thinkPHP框架实现的无限回复评论功能示例
Jun 09 PHP
PHP面向对象类型约束用法分析
Jun 12 PHP
laravel dingo API返回自定义错误信息的实例
Sep 29 PHP
Laravel 集成微信用户登录和绑定的实现
Dec 27 PHP
PHP中->和=>的意思
Mar 31 PHP
PHP 和 COM
Oct 09 #PHP
如何获得PHP相关资料
Oct 09 #PHP
VML绘图板②脚本--VMLgraph.js、XMLtool.js
Oct 09 #PHP
example1.php
Oct 09 #PHP
一个ftp类(ini.php)
Oct 09 #PHP
php中数据的批量导入(csv文件)
Oct 09 #PHP
第四节 构造函数和析构函数 [4]
Oct 09 #PHP
You might like
最令PHP初学者们头痛的十四个问题
2007/01/15 PHP
两种设置php载入页面时编码的方法
2014/07/29 PHP
php判断类是否存在函数class_exists用法分析
2014/11/14 PHP
PHP生成静态HTML页面最简单方法示例
2015/04/09 PHP
实例讲解YII2中多表关联的使用方法
2017/07/21 PHP
背景音乐每次刷新都可以自动更换
2007/02/01 Javascript
javascript while语句和do while语句的区别分析
2007/12/08 Javascript
jquery实现当滑动到一定位置时固定效果
2014/06/17 Javascript
属于你的jQuery提示框(Tip)插件
2016/01/20 Javascript
JavaScript数据结构与算法之集合(Set)
2016/01/29 Javascript
BootstrapTable与KnockoutJS相结合实现增删改查功能【一】
2016/05/10 Javascript
详解JavaScript中的事件流和事件处理程序
2016/05/20 Javascript
深入理解jquery中extend的实现
2016/12/22 Javascript
javascript 开发之百度地图使用到的js函数整理
2017/05/19 Javascript
JS非空验证及邮箱验证的实例
2017/08/11 Javascript
使用jQuery实现简单的tab框实例
2017/08/22 jQuery
vue中简单弹框dialog的实现方法
2018/02/26 Javascript
微信小程序使用wxParse解析html的方法教程
2018/07/06 Javascript
vue 地图可视化 maptalks 篇实例代码详解
2019/05/21 Javascript
Vue全局loading及错误提示的思路与实现
2019/08/09 Javascript
Vue使用v-viewer实现图片预览
2020/10/21 Javascript
5种Python单例模式的实现方式
2016/01/14 Python
python画出三角形外接圆和内切圆的方法
2018/01/25 Python
Python实现的KMeans聚类算法实例分析
2018/12/29 Python
解决pycharm 远程调试 上传 helpers 卡住的问题
2019/06/27 Python
python判断自身是否正在运行的方法
2019/08/08 Python
Django REST Framework 分页(Pagination)详解
2020/11/30 Python
CSS3 3D酷炫立方体变换动画的实现
2019/03/26 HTML / CSS
优衣库美国官网:UNIQLO美国
2018/04/14 全球购物
博士生入学考试推荐信
2013/11/17 职场文书
工作自我评价分享
2013/12/01 职场文书
小学校园之星事迹材料
2014/05/16 职场文书
离婚协议书应该怎么写
2014/10/12 职场文书
[有人@你]你有一封绿色倡议书,请查收!
2019/07/18 职场文书
Nginx开启Brotli压缩算法实现过程详解
2021/03/31 Servers
MySQL中的隐藏列的具体查看
2021/09/04 MySQL