本節(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
),遇到類似如下的問(wèn)題:
請(qǐng)認(rèn)真閱讀 PHP 的 安裝說(shuō)明,并注意要編譯 PHP 需要同時(shí)安裝 flex 和 bison。根據(jù)設(shè)置的不同,可以從源代碼編譯 bison 和 flex,要么通過(guò)已編譯好的發(fā)行包,例如 RPM。
可以通過(guò)指定附加的選項(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)告說(shuō)在和 Apache 連接時(shí)他們不得不緊接著 libphp4.a之后加上“-ldl”。
這其實(shí)很簡(jiǎn)單。小心地照著以下步驟來(lái):
AddModule modules/php4/libphp4.a
。
make
。
注意:也可以用新的 Apache
./configure
腳本。參見 Apache 發(fā)行包中
README.configure
文件中的說(shuō)明。也看看 PHP 發(fā)行包中的
INSTALL文件。
這說(shuō)明 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)告說(shuō)我的編譯器不服從 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í)遇到類似這樣的問(wèn)題:
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
的過(guò)程中出現(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)致問(wèn)題。確保使用 GNU 工具來(lái)確保能夠正確編譯 PHP。例如,在 Solaris 下面不論使用 SunOS BSD 兼容或者 Solaris 版本的
sed
都不行,但是使用 GNU 或者 Sun POSIX (xpg4) 版本的
sed
就可以。相關(guān)連接:
? GNU sed,
? GNU flex,
? GNU bison。