FAQ
在线手册:中文 英文
PHP手册

编译问题

本节汇集了大多数编译时出现的常见错误。

  1. 我用匿名 CVS 得到了最新版的 PHP,但是里面没有 configure 脚本!
  2. 我在配置 PHP 和 Apache 一起工作时遇到了问题。说没找到 httpd.h,但这个文件明明就在那里!
  3. 当运行 PHP 配置时( ./configure),遇到类似如下的问题: checking lex output file root... ./configure: lex: command not found configure: error: cannot find output from lex; giving up
  4. 当试图启动 Apache 时,得到类似如下错误信息: fatal: relocation error: file /path/to/libphp4.so: symbol ap_block_alarms: referenced symbol not found
  5. 当运行 configure 时,报告说找不到头文件或 GD 库或 gdbm,或其它的什么包!
  6. 当编译 language-parser.tab.c文件时,报错说 yytname undeclared。
  7. 当我运行 make时,看上去一切正常,可当连接最后的程序时报告说找不到某些文件而失败了。
  8. 当连接 PHP 时,报告说有一些未定义的引用。
  9. 我不知道怎样把 PHP 和 Apache 1.3 一起编译。
  10. 我按照所有的步骤在 UNIX 下安装了PHP 的 Apache 模块版本,但我的 PHP 脚本被显示在浏览器中或者提示保存此文件。
  11. 说要用: --activate-module=src/modules/php4/libphp4.a,但是此文件根本不存在,于是我改成了 --activate-module=src/modules/php4/libmodphp4.a,结果不行。怎么回事?
  12. 当我用 --activate-module=src/modules/php4/libphp4.a试着把 PHP 编译成 Apache 的静态模块时,报告说我的编译器不服从 ANSI 标准。
  13. 当我用 --with-apxs编译 PHP 时得到奇怪的错误信息。
  14. 在 make的过程中,在 microtime 中出错,还有很多 RUSAGE_之类的东西。
  15. 当带 MySQL 编译 PHP 时,可以正确地运行配置,但是在 make的过程中出现了类似以下的错误信息: ext/mysql/libmysql/my_tempnam.o(.text+0x46): In function my_tempnam': /php4/ext/mysql/libmysql/my_tempnam.c:103: the use of tempnam' is dangerous, better use mkstemp',这是怎么回事
  16. 我想升级我的 PHP。上哪里找到我用来配置目前的 PHP 的 ./configure的参数呢?
  17. 和 GD 库一起编译 PHP 时,要么给出一个奇怪的编译错误,要么在运行时出现 segfaults。
  18. 当编译 PHP 时我看到一些随机的错误,好像死了。我用的是 Solaris,不知道有没有关系。
我用匿名 CVS 得到了最新版的 PHP,但是里面没有 configure 脚本!

你必须安装有 GNU 的 autoconf 包,这样才可以从 configure.in生成 configure 脚本。从 CVS 得到源程序后只要在最高层的目录中运行 ./buildconf即可。(同样,除非你用了 --enable-maintainer-mode选项来运行 configure,否则即使 configure.in文件更新了,configure 脚本也不会自动重新生成。所以当你发现 configure.in文件更新了时要确保手工重新生成 configure 脚本。有一个症状是在 configure 之后或者运行 config.status时在 Makefile 中寻找类似 @VARIABLE@ 的东西。)

我在配置 PHP 和 Apache 一起工作时遇到了问题。说没找到 httpd.h,但这个文件明明就在那里!

你需要告诉 configure/setup 脚本你的 Apache 源程序最上层的目录位置。这意味着你需要这样指定 --with-apache=/path/to/apache不是这样 --with-apache=/path/to/apache/src

当运行 PHP 配置时( ./configure),遇到类似如下的问题:
checking lex output file root... ./configure: lex: command not found configure: error: cannot find output from lex; giving up

请认真阅读 PHP 的 安装说明,并注意要编译 PHP 需要同时安装 flex 和 bison。根据设置的不同,可以从源代码编译 bison 和 flex,要么通过已编译好的发行包,例如 RPM。

当试图启动 Apache 时,得到类似如下错误信息:
fatal: relocation error: file /path/to/libphp4.so: symbol ap_block_alarms: referenced symbol not found

该错误通常在 Apache 的核心程序被编译为共享用途的 DSO 库时发生。请尝试重新配置 Apache,确保至少使用了如下参数:

--enable-shared=max --enable-rule=SHARED_CORE

更多信息,请阅读 Apache 顶层目录的 INSTALL文件或者 Apache 的 » DSO 手册

当运行 configure 时,报告说找不到头文件或 GD 库或 gdbm,或其它的什么包!

可以通过指定附加的选项让 configure 脚本在非标准的路径中寻找头文件和库并传递给 C 预处理器和连接器,例如:

    CPPFLAGS=-I/path/to/include LDFLAGS=-L/path/to/library ./configure
如果用 csh 的变种作为你的登录 shell(为什么?),那就是:
    env CPPFLAGS=-I/path/to/include LDFLAGS=-L/path/to/library ./configure

当编译 language-parser.tab.c文件时,报错说 yytname undeclared

需要更新 Bison 的版本。最新版本在 » http://www.gnu.org/software/bison/bison.html

当连接 PHP 时,报告说有一些未定义的引用。

看看连接的这一行命令,确认所有适当的库都包括在最后了。通常可能漏掉了“-ldl”和你包括的任何数据库支持所需要的库。

如果和 Apache 1.2.x 一起连接,记得把适当的信息添加到配置文件的 EXTRA_LIBS 这一行并重新运行 Apache 的配置脚本了吗?更多信息见 安装一章。

一些人也报告说在和 Apache 连接时他们不得不紧接着 libphp4.a之后加上“-ldl”。

我不知道怎样把 PHP 和 Apache 1.3 一起编译。

这其实很简单。小心地照着以下步骤来:

  • » http://httpd.apache.org/download.cgi下载最新版的 Apache 1.3。
  • 解压缩到某处,例如 /usr/local/src/apache-1.3
  • 编译 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
  • 你现在应该有一个包括 PHP 支持的 httpd 可执行程序了!

注意:也可以用新的 Apache ./configure脚本。参见 Apache