PHP Conference Japan 2024

构建问题

本节收集了构建时出现的大多数常见错误。

  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 将 Apache 与 PHP 作为静态模块构建时,它告诉我我的编译器不符合 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', 哪里出错了?
  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 undeclared

您需要更新您的 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 配置文件的默认位置在 Apache 1.2 和 Apache 1.3 之间发生了变化。您应该检查以确保您正在添加 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 将 Apache 与 PHP 作为静态模块构建时,它告诉我我的编译器不符合 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