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