构建问题

本节收集了构建时最常见的错误。

  1. 我使用匿名 Git 服务获取了最新版本的 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 未声明。
  7. 当我运行 make 时,它似乎运行正常,但在尝试链接最终应用程序时失败,并抱怨找不到某些文件。
  8. 在链接 PHP 时,它会抱怨一些未定义的引用。
  9. 我已经按照所有步骤在 Unix 上安装了 Apache 模块版本,但我的 PHP 脚本在我的浏览器中显示出来,或者我被要求保存文件。
  10. 它说使用:--activate-module=src/modules/php4/libphp4.a,但该文件不存在,所以我将其更改为 --activate-module=src/modules/php4/libmodphp4.a,但它不起作用!怎么回事?
  11. 当我尝试使用 --activate-module=src/modules/php4/libphp4.a 将 PHP 作为静态模块构建 Apache 时,它告诉我我的编译器不符合 ANSI。
  12. 当我尝试使用 --with-apxs 构建 PHP 时,我遇到了一些奇怪的错误消息。
  13. 在 make 期间,我在 microtime 中遇到错误,以及很多 RUSAGE_ 东西。
  14. 在使用 MySQL 编译 PHP 时,configure 运行正常,但在 make 期间我遇到了类似于以下内容的错误:ext/mysql/libmysqlclient/my_tempnam.o(.text+0x46): In function my_tempnam': /php4/ext/mysql/libmysqlclient/my_tempnam.c:103: the use of tempnam' is dangerous, better use mkstemp', what's wrong?
  15. 我想升级我的 PHP。在哪里可以找到用于构建我当前 PHP 安装的 ./configure 行?
  16. 在使用 GD 库构建 PHP 时,它要么给出奇怪的编译错误,要么在执行时出现段错误。
  17. 在编译 PHP 时,我似乎遇到了随机错误,比如它挂起了。我使用的是 Solaris,如果这很重要的话。
我使用匿名 Git 服务获取了最新版本的 PHP,但没有 configure 脚本!

您必须安装 GNU autoconf 包,以便您可以从 configure.in 生成 configure 脚本。从 Git 服务器获取源代码后,只需在顶层目录中运行 ./buildconf 即可。(此外,除非您使用 --enable-maintainer-mode 选项运行 configure,否则 configure 脚本在 configure.in 文件更新时不会自动重建,因此您应该在注意到 configure.in 发生了更改时手动进行操作。这的一个症状是在 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

请务必仔细阅读 安装 说明,并注意您需要同时安装 flex 和 bison 才能编译 PHP。根据您的设置,您将从源代码或软件包(如 RPM)安装 bison 和 flex。

当我尝试启动 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 或其他软件包的包含文件或库!

您可以通过指定要传递给 C 预处理器和链接器的附加标志,让 configure 脚本在非标准位置查找头文件和库,例如

    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 未声明

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

在链接 PHP 时,它会抱怨一些未定义的引用。

查看链接行,确保在最后包含了所有合适的库。您可能遗漏的一些常见库是 '-ldl' 以及您包含的任何数据库支持所需的库。

有些人还报告说,他们在与 Apache 链接时,必须在 libphp4.a 之后立即添加 '-ldl'。

我已经按照所有步骤在 Unix 上安装了 Apache 模块版本,但我的 PHP 脚本在我的浏览器中显示出来,或者我被要求保存文件。

这意味着 PHP 模块出于某种原因没有被调用。在寻求进一步帮助之前,有三个事项需要检查

  • 确保您正在运行的 httpd 二进制文件是您刚构建的实际新 httpd 二进制文件。为此,尝试运行:/path/to/binary/httpd -l 如果您没有看到 mod_php4.c 列出,那么您正在运行的不是正确的二进制文件。找到并安装正确的二进制文件。
  • 确保您已将正确的 Mime 类型添加到一个 Apache .conf 文件中。它应该是:AddType application/x-httpd-php .php 还要确保此 AddType 行没有隐藏在 <Virtualhost> 或 <Directory> 块中,这会阻止它应用于测试脚本的位置。
  • 最后,Apache 1.2 和 Apache 1.3 之间的默认 Apache 配置文件位置发生了更改。您应该检查以确保您添加 AddType 行的配置文件确实正在被读取。您可以在 httpd.conf 文件或其他一些明显的更改中添加一个明显的语法错误,这将告诉您该文件是否正在被正确读取。

它说使用:--activate-module=src/modules/php4/libphp4.a,但该文件不存在,所以我将其更改为 --activate-module=src/modules/php4/libmodphp4.a,但它不起作用!怎么回事?

请注意,libphp4.a 文件不应该存在。apache 进程会创建它!

当我尝试使用 --activate-module=src/modules/php4/libphp4.a 将 PHP 作为静态模块构建 Apache 时,它告诉我我的编译器不符合 ANSI。

这是 Apache 的误导性错误消息,在较新的版本中已修复。

当我尝试使用 --with-apxs 构建 PHP 时,我遇到了一些奇怪的错误消息。

这里有三个事项需要检查。首先,出于某种原因,当 Apache 构建 apxs Perl 脚本时,它有时会以不正确的编译器和标志变量构建。找到您的 apxs 脚本(尝试命令 which apxs),它有时位于 /usr/local/apache/bin/apxs/usr/sbin/apxs 中。打开它,检查类似于以下内容的行

my $CFG_CFLAGS_SHLIB  = ' ';          # substituted via Makefile.tmpl
my $CFG_LD_SHLIB      = ' ';          # substituted via Makefile.tmpl
my $CFG_LDFLAGS_SHLIB = ' ';          # substituted via Makefile.tmpl
如果您看到这些,您就找到了问题所在。它们可能只包含空格或其他不正确的值,例如 'q()'。将这些行更改为
my $CFG_CFLAGS_SHLIB  = '-fpic -DSHARED_MODULE'; # substituted via Makefile.tmpl
my $CFG_LD_SHLIB      = 'gcc';                   # substituted via Makefile.tmpl
my $CFG_LDFLAGS_SHLIB = q(-shared);              # substituted via Makefile.tmpl 
第二个可能的问题只会在 Red Hat 6.1 和 6.2 上出现。Red Hat 提供的 apxs 脚本已损坏。查找以下行
my $CFG_LIBEXECDIR    = 'modules';         # substituted via APACI install
如果您看到上面的行,将其更改为
my $CFG_LIBEXECDIR    = '/usr/lib/apache'; # substituted via APACI install
最后,如果您重新配置/重新安装 Apache,请在 ./configure 之后和 make 之前添加 make clean

make 期间,我在 microtime 中遇到错误,以及很多 RUSAGE_ 东西。

在安装的 make 部分,如果您遇到类似于以下内容的问题

microtime.c: In function `php_if_getrusage':
microtime.c:94: storage size of `usg' isn't known
microtime.c:97: `RUSAGE_SELF' undeclared (first use in this function)
microtime.c:97: (Each undeclared identifier is reported only once
microtime.c:97: for each function it appears in.)
microtime.c:103: `RUSAGE_CHILDREN' undeclared (first use in this function)
make[3]: *** [microtime.lo] Error 1
make[3]: Leaving directory `/home/master/php-4.0.1/ext/standard'
make[2]: *** [all-recursive] Error 1
make[2]: Leaving directory `/home/master/php-4.0.1/ext/standard'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/home/master/php-4.0.1/ext'
make: *** [all-recursive] Error 1

您的系统已损坏。您需要通过安装与您的 glibc 相匹配的 glibc-devel 包来修复您的 /usr/include 文件。这与 PHP 绝对没有任何关系。要验证这一点,请尝试以下简单测试

$ cat >test.c <<X
#include <sys/resource.h>
X
$ gcc -E test.c >/dev/null
如果它输出错误,那么您就知道您的包含文件已损坏。

在使用 MySQL 编译 PHP 时,配置运行良好,但在执行 make 时,我遇到了类似以下的错误:ext/mysql/libmysqlclient/my_tempnam.o(.text+0x46): In function my_tempnam': /php4/ext/mysql/libmysqlclient/my_tempnam.c:103: the use of tempnam' is dangerous, better use mkstemp',问题出在哪里?

首先,重要的是要认识到这是一个 警告,而不是致命错误。由于这通常是 make 过程中看到的最后一个输出,因此可能看起来像一个致命错误,但实际上并非如此。当然,如果你将编译器设置为在遇到警告时停止,它就会停止。还要记住,MySQL 支持默认情况下是启用的。

注意:

从 PHP 4.3.2 开始,在构建(make)完成后,你还会看到以下文本


构建完成。
(可以安全地忽略关于 tempnam 和 tmpnam 的警告)。

我想升级我的 PHP。在哪里可以找到用于构建我当前 PHP 安装的 ./configure 命令行?

你可以查看当前 PHP 安装的源代码树中的 config.nice 文件,或者,如果该文件不可用,只需运行以下命令:

<?php phpinfo(); ?>
脚本。在输出的顶部将显示用于构建此 PHP 安装的 ./configure 命令行。

在使用 GD 库构建 PHP 时,它要么给出奇怪的编译错误,要么在执行时出现段错误。

确保你的 GD 库和 PHP 链接到相同的依赖库(例如 libpng)。

在编译 PHP 时,我似乎遇到了随机错误,比如它挂起了。我使用的是 Solaris,如果这很重要的话。

在编译 PHP 时使用非 GNU 工具可能会导致问题。确保使用 GNU 工具以确保编译 PHP 能正常工作。例如,在 Solaris 上,使用 SunOS BSD 兼容版本或 Solaris 版本的 sed 将无法工作,但使用 GNU 或 Sun POSIX(xpg4)版本的 sed 将可以正常工作。链接:» GNU sed» GNU flex,以及 » GNU bison

添加注释

用户贡献的注释

此页面没有用户贡献的注释。
To Top