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