本節收集建置時發生的大部分常見錯誤。
您必須安裝 GNU autoconf 套件,以便您可以從 configure.in 產生 configure 指令碼。從 Git 伺服器取得來源後,只需在頂層目錄中執行 ./buildconf。(此外,除非您使用 --enable-maintainer-mode
選項執行 configure,否則當 configure.in 檔案更新時,configure 指令碼不會自動重建,因此當您注意到 configure.in 已變更時,應該手動執行此操作。其中一個徵兆是在執行 configure 或 config.status 之後,在您的 Makefile 中找到類似 @VARIABLE@ 的內容。)
您需要告訴 configure/setup 指令碼您的 Apache 來源樹的頂層位置。這表示您要指定 --with-apache=/path/to/apache,而不是 --with-apache=/path/to/apache/src。
./configure
) 時,您會遇到類似以下錯誤請務必仔細閱讀安裝說明,並注意您需要安裝 flex 和 bison 才能編譯 PHP。視您的設定而定,您將從來源或套件(例如 RPM)安裝 bison 和 flex。
您可以藉由指定要傳遞至 C 前置處理器和連結器的其他旗標,讓 configure 指令碼在非標準位置尋找標頭檔和函式庫,例如
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 版本。您可以在 » https://gnu.dev.org.tw/software/bison/bison.html 找到最新版本。
某些舊版本的 make 無法將 functions 目錄中已編譯的檔案版本正確地放入同一目錄中。嘗試執行 cp *.o functions,然後重新執行 make,看看是否有幫助。如果有幫助,您真的應該升級到最新版本的 GNU make。
請查看連結行,並確定所有適當的函式庫都包含在結尾。您可能遺漏的常見函式庫是 '-ldl' 和您包含的任何資料庫支援所需的任何函式庫。
有些人也回報說,他們必須在連結 Apache 時,緊接著 libphp4.a 之後新增 '-ldl'。
這表示由於某些原因,PHP 模組未被叫用。在要求進一步協助之前,請檢查三件事
/path/to/binary/httpd -l
如果您沒有看到列出的 mod_php4.c,則您執行的不是正確的二進位檔案。尋找並安裝正確的二進位檔案。 Apache .conf
檔案。它應該是:AddType application/x-httpd-php .php
另外請確定此 AddType 行未隱藏在 <Virtualhost> 或 <Directory> 區塊中,這會阻止它套用至您的測試指令碼的位置。 --activate-module=src/modules/php4/libphp4.a
,但該檔案不存在,因此我將它變更為 --activate-module=src/modules/php4/libmodphp4.a
,但它無法運作!? 發生了什麼事?請注意,libphp4.a 檔案不應該存在。apache 程序會建立它!
--activate-module=src/modules/php4/libphp4.a
將 PHP 建置為靜態模組時,它告訴我編譯器不符合 ANSI 規範。這是來自 Apache 的誤導性錯誤訊息,在較新版本中已修正。
這裡有三件事要檢查。首先,由於某些原因,當 Apache 建置 apxs Perl 指令碼時,它有時最終會在沒有適當編譯器和旗標變數的情況下建置。尋找您的 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
您的系統壞了。您需要安裝與您的 glibc 相符的 glibc-devel 套件來修正您的 /usr/include 檔案。這與 PHP 完全無關。為了向您證明這一點,請嘗試這個簡單的測試
$ cat >test.c <<X #include <sys/resource.h> X $ gcc -E test.c >/dev/null
make
期間,我收到類似以下的錯誤: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)完成後看到以下文字
建置完成。
(忽略關於 tempnam 和 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。