本節(jié)匯集了大多數(shù)編譯時出現(xiàn)的常見錯誤。
你必須安裝有 GNU autoconf 包,這樣才可以從
configure.in生成 configure 腳本。從 GIT 服務(wù)中得到源程序后只要在最高層的目錄中運行
./buildconf即可。(同時要注意,除非你用了
--enable-maintainer-mode選項來運行 configure,否則即使
configure.in文件更新了,configure 腳本也不會自動重新生成。所以當(dāng)你發(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),遇到類似如下的問題:
請認(rèn)真閱讀 PHP 的 安裝說明,并注意要編譯 PHP 需要同時安裝 flex 和 bison。根據(jù)設(shè)置的不同,可以從源代碼編譯 bison 和 flex,要么通過已編譯好的發(fā)行包,例如 RPM。
可以通過指定附加的選項讓 configure 腳本在非標(biāo)準(zhǔn)的路徑中尋找頭文件和庫并傳遞給 C 預(yù)處理器和連接器,例如:
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。
看看連接的這一行命令,確認(rèn)所有適當(dāng)?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 類型。應(yīng)該是:
AddType application/x-httpd-php .php
也確認(rèn) AddType 這一行沒有隱藏在 <Virtualhost> 或者 <Directory> 塊中,這可能會造成你的測試腳本所在位置沒有被應(yīng)用到此設(shè)置。
--activate-module=src/modules/php4/libphp4.a,但是此文件根本不存在,于是我改成了
--activate-module=src/modules/php4/libmodphp4.a,結(jié)果不行。怎么回事?
注意 libphp4.a文件本來就不該存在,apache 進(jìn)程將創(chuàng)建它!
--activate-module=src/modules/php4/libphp4.a試著把 PHP 編譯成 Apache 的靜態(tài)模塊時,報告說我的編譯器不服從 ANSI 標(biāo)準(zhǔn)。
這是一個 Apache 誤報的錯誤信息,在新的版本中已經(jīng)修正了。
這里要檢查三件事。首先,出于某些原因當(dāng) Apache 生成 apxs Perl 腳本時,有時沒有正確的編譯和標(biāo)記變量就結(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 包來修復(fù) /usr/include中的文件。這和 PHP 絕對沒有任何關(guān)系。要證實這一點,試試這個簡單的測試:
$ 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',這是怎么回事
首先,我們需要認(rèn)識到這只是個
警告,而非致命錯誤。由于這條信息通常是在
make的最后輸出的,所以看起來它可能像是一個致命錯誤,但實際上不是。當(dāng)然,如果將編譯器設(shè)置成遇見警告信息時停止,則這也可以算是致命錯誤。另外值得一提的是,MySQL 的支持是默認(rèn)打開的。
注意:
自 PHP 4.3.2 起,你將在編譯(make)結(jié)束后看到下面的文字:
Build complete.
(It is safe to ignore warnings about tempnam and tmpnam).
要么在你用來編譯當(dāng)前的 PHP 的源碼樹中查看 config.nice 文件,如果沒有,只要運行此腳本:
<?php phpinfo(); ?>
確保你的 GD 庫和 PHP 在連接時使用了用同樣的支持庫(例如 libpng)。
當(dāng)編譯 PHP 時使用非 GNU 的工具會導(dǎo)致問題。確保使用 GNU 工具來確保能夠正確編譯 PHP。例如,在 Solaris 下面不論使用 SunOS BSD 兼容或者 Solaris 版本的
sed都不行,但是使用 GNU 或者 Sun POSIX (xpg4) 版本的
sed就可以。相關(guān)連接:
? GNU sed,
? GNU flex,
? GNU bison。