本节收集了构建时出现的大多数常见错误。
您必须安装 GNU autoconf 软件包,以便您可以从 configure.in 生成 configure 脚本。从 Git 服务器获取源代码后,只需在顶级目录中运行 ./buildconf。(此外,除非您使用 --enable-maintainer-mode
选项运行 configure,否则 configure 脚本在 configure.in 文件更新时不会自动重新构建,因此您应该确保在您注意到 configure.in 已更改时手动执行此操作。此问题的一个症状是在运行 configure 或 config.status 之后在 Makefile 中找到类似 @VARIABLE@ 的内容。)
您需要告诉 configure/setup 脚本 Apache 源代码树的顶层位置。这意味着您需要指定 --with-apache=/path/to/apache 而不是 --with-apache=/path/to/apache/src。
./configure
)时,您会遇到类似以下的错误请务必仔细阅读 安装 指南,并注意您需要安装 flex 和 bison 才能编译 PHP。根据您的设置,您将从源代码或软件包(例如 RPM)安装 bison 和 flex。
您可以通过指定传递给 C 预处理器和链接器的其他标志来使 configure 脚本在非标准位置查找头文件和库,例如
CPPFLAGS=-I/path/to/include LDFLAGS=-L/path/to/library ./configure
env CPPFLAGS=-I/path/to/include LDFLAGS=-L/path/to/library ./configure
yytname undeclared
。您需要更新您的 Bison 版本。您可以在 » http://www.gnu.org/software/bison/bison.html 找到最新版本。
某些旧版本的 make 未能正确地将文件的已编译版本从 functions 目录放入同一目录中。尝试运行 cp *.o functions,然后重新运行 make 以查看是否有帮助。如果可以,您应该真正升级到最新版本的 GNU make。
查看链接行,并确保所有适当的库都包含在最后。您可能错过的常见库是 '-ldl' 以及您包含的任何数据库支持所需的任何库。
有些人还报告说,在与 Apache 链接时,他们必须在 libphp4.a 之后立即添加 '-ldl'。
这意味着出于某种原因 PHP 模块未被调用。在寻求进一步帮助之前,需要检查三件事
/path/to/binary/httpd -l
如果您没有看到 mod_php4.c 列出,那么您没有运行正确的二进制文件。找到并安装正确的二进制文件。 Apache .conf
文件中。它应该是:AddType application/x-httpd-php .php
还要确保此 AddType 行没有隐藏在 <Virtualhost> 或 <Directory> 块中,否则将阻止它应用于测试脚本的位置。 --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 发出的一个误导性错误消息,在较新的版本中已修复。
这里有三个需要检查的地方。首先,出于某种原因,当 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
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
my $CFG_LIBEXECDIR = 'modules'; # substituted via APACI install
my $CFG_LIBEXECDIR = '/usr/lib/apache'; # substituted via APACI install
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
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 安装源代码树中的 config.nice 文件,或者如果此文件不可用,只需运行
<?php phpinfo(); ?>
确保你的 GD 库和 PHP 链接到相同的依赖库(例如 libpng)。
在编译 PHP 时使用非 GNU 实用程序可能会导致问题。确保使用 GNU 工具以确保 PHP 编译能够正常工作。例如,在 Solaris 上,使用 SunOS BSD 兼容版本或 Solaris 版本的 sed
将无法工作,但使用 GNU 或 Sun POSIX (xpg4) 版本的 sed
将可以工作。链接:» GNU sed、» GNU flex 和 » GNU bison。