本節(jié)匯集了大多數(shù)編譯時出現(xiàn)的常見錯誤。
你必須安裝有 GNU autoconf 包,這樣才可以從
configure.in生成 configure 腳本。從 GIT 服務中得到源程序后只要在最高層的目錄中運行
./buildconf即可。(同時要注意,除非你用了
--enable-maintainer-mode
選項來運行 configure,否則即使
configure.in文件更新了,configure 腳本也不會自動重新生成。所以當你發(fā)現(xiàn)
configure.in文件更新了時要確保手工重新生成 configure 腳本。有一個癥狀是在 configure 之后或者運行
config.status時在 Makefile 中尋找類似 @VARIABLE@ 的東西。)
你需要告訴 configure/setup 腳本你的 Apache 源程序最上層的目錄位置。這意味著你需要這樣指定 --with-apache=/path/to/apache而 不是這樣 --with-apache=/path/to/apache/src。
./configure
),遇到類似如下的問題:
請認真閱讀 PHP 的 安裝說明,并注意要編譯 PHP 需要同時安裝 flex 和 bison。根據(jù)設置的不同,可以從源代碼編譯 bison 和 flex,要么通過已編譯好的發(fā)行包,例如 RPM。
可以通過指定附加的選項讓 configure 腳本在非標準的路徑中尋找頭文件和庫并傳遞給 C 預處理器和連接器,例如:
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。
看看連接的這一行命令,確認所有適當?shù)膸於及ㄔ谧詈罅?。通常可能漏掉了?ldl”和你包括的任何數(shù)據(jù)庫支持所需要的庫。
一些人也報告說在和 Apache 連接時他們不得不緊接著 libphp4.a之后加上“-ldl”。
這其實很簡單。小心地照著以下步驟來:
AddModule modules/php4/libphp4.a
。
make
。
注意:也可以用新的 Apache
./configure
腳本。參見 Apache 發(fā)行包中
README.configure
文件中的說明。也看看 PHP 發(fā)行包中的
INSTALL文件。
這說明 PHP 模塊出于某些原因沒有被調(diào)用。在尋求更多幫助前先檢查三件事:
/path/to/binary/httpd -l
如果你沒看到
mod_php4.c被列出來那你就沒有運行對程序。找到并正確安裝程序。
Apache .conf
文件中加入了正確的 Mime 類型。應該是:
AddType application/x-httpd-php .php
也確認 AddType 這一行沒有隱藏在 <Virtualhost> 或者 <Directory> 塊中,這可能會造成你的測試腳本所在位置沒有被應用到此設置。
--activate-module=src/modules/php4/libphp4.a
,但是此文件根本不存在,于是我改成了
--activate-module=src/modules/php4/libmodphp4.a
,結(jié)果不行。怎么回事?
注意 libphp4.a文件本來就不該存在,apache 進程將創(chuàng)建它!
--activate-module=src/modules/php4/libphp4.a
試著把 PHP 編譯成 Apache 的靜態(tài)模塊時,報告說我的編譯器不服從 ANSI 標準。
這是一個 Apache 誤報的錯誤信息,在新的版本中已經(jīng)修正了。
這里要檢查三件事。首先,出于某些原因當 Apache 生成 apxs Perl 腳本時,有時沒有正確的編譯和標記變量就結(jié)束了。找到你的 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
你的系統(tǒng)壞了。你需要安裝一個符合你的 glibc 的 glibc-devel 包來修復 /usr/include中的文件。這和 PHP 絕對沒有任何關系。要證實這一點,試試這個簡單的測試:
$ cat >test.c <<X #include <sys/resource.h> X $ gcc -E test.c >/dev/null
make
的過程中出現(xiàn)了類似以下的錯誤信息:
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)結(jié)束后看到下面的文字:
Build complete.
(It is safe to ignore warnings about tempnam and 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。