本节收集了构建时最常见的错误。
您必须安装 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 未声明
。您需要更新您的 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
将 PHP 作为静态模块构建 Apache 时,它告诉我我的编译器不符合 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。