编译问题


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 相关文章推荐
PHP中改变图片的尺寸大小的代码
Jul 17 PHP
php分页思路以及在ZF中的使用
May 30 PHP
PHP中$_FILES的使用方法及注意事项说明
Feb 14 PHP
destoon实现底部添加你是第几位访问者的方法
Jul 15 PHP
WordPress中is_singular()函数简介
Feb 05 PHP
PHP基于MySQL数据库实现对象持久层的方法
Jun 17 PHP
php实现只保留mysql中最新1000条记录
Jun 18 PHP
如何使用PHP对网站验证码进行破解
Sep 17 PHP
关于PHP文件的自动运行方法分析
May 13 PHP
php实现将base64格式图片保存在指定目录的方法
Oct 13 PHP
PHP判断表达式中括号是否匹配的简单实例
Oct 22 PHP
YII2框架中actions的作用与使用方法示例
Mar 13 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
set_include_path在win和linux下的区别
2008/01/10 PHP
php 数组二分法查找函数代码
2010/02/16 PHP
php检测用户是否用手机(Mobile)访问网站的类
2014/01/09 PHP
php魔法函数与魔法常量使用介绍
2017/07/23 PHP
PHP 的Opcache加速的使用方法
2017/12/29 PHP
PHP中常见的密码处理方式和建议总结
2018/10/14 PHP
laravel邮件发送的实现代码示例
2020/01/31 PHP
可简单避免的三个JS发布错误的详细介绍
2013/08/02 Javascript
getJSON调用后台json数据时函数被调用两次的原因猜想
2013/09/29 Javascript
Javascript blur与click冲突解决办法
2017/01/09 Javascript
javascript DOM的详解及实例代码
2017/03/06 Javascript
vue实现在表格里,取每行的id的方法
2018/03/09 Javascript
vue-vuex中使用commit提交mutation来修改state的方法详解
2018/09/16 Javascript
vue实现路由懒加载的3种方法示例
2020/09/01 Javascript
[03:17]DOTA2英雄基础教程 剧毒术士
2013/12/12 DOTA
[44:40]2018DOTA2亚洲邀请赛3月30日 小组赛A组Liquid VS OG
2018/03/31 DOTA
Python设置Socket代理及实现远程摄像头控制的例子
2015/11/13 Python
Python基于socket实现简单的即时通讯功能示例
2018/01/16 Python
Python实现自定义函数的5种常见形式分析
2018/06/16 Python
python3实现随机数
2018/06/25 Python
python列表list保留顺序去重的实例
2018/12/14 Python
详解python校验SQL脚本命名规则
2019/03/22 Python
python制作图片缩略图
2019/04/30 Python
详解Pandas 处理缺失值指令大全
2020/07/30 Python
20行Python代码实现一款永久免费PDF编辑工具的实现
2020/08/27 Python
HTML5中微数据概述及在搜索引擎中的使用举例
2013/02/07 HTML / CSS
美国内衣品牌:Leonisa
2016/08/14 全球购物
找到不普通的东西:Bonanza
2016/10/20 全球购物
全球性的在线购物网站:Zapals
2017/03/22 全球购物
英国和世界各地鲜花速递专家:Arena Flowers
2018/02/10 全球购物
莱德杯高尔夫欧洲官方商店:Ryder Cup Shop
2019/08/14 全球购物
电子商务专业学生的自我鉴定
2013/11/28 职场文书
倡议书范文格式
2014/05/12 职场文书
法人授权委托书公证范本
2014/09/14 职场文书
预备党员的思想汇报,你真的会写吗?
2019/06/28 职场文书
CSS中calc(100%-100px)不加空格不生效
2023/05/07 HTML / CSS