這章節蒐集了許多編譯時會產生的錯誤狀況。 1. 我用匿名CVS得到最新版的源代碼包, 但沒有配置腳本文件! 2. 我在配置 PHP 在 Apache下工作時出了問題。 它說不能找到httpd.h, 可是我看它就在那裡! 3. 當我運行conifgure時,它說它不能找到include文件或一些庫: GD, gdbm, 或其它的一些包! 4. 我在編譯文件language-parser.tab.c時, 出錯,提示: yytname undeclared. 5. 當我運行make, 起初正常但最終失敗了,在連接最後的應用時,出錯說找不到一些文件。 6. 在連接 PHP 時, 出一堆錯說 undefined references。 7. 我不清楚如何在 Apache 1.3下編譯PHP。 8. 我依照步驟一步一步安裝了Apache模組(Unix下), 可是在瀏覽器裡開啟 PHP 腳本時它卻問我是否要儲存。 9. 系統說使用: --activate-module=src/modules/php4/libphp4.a, 可那檔案根本不存在, 我只好改成--activate-module=src/modules/php4/libmodphp4.a 好了,它不工作了! 該怎麼辦? 10. 我要把PHP編譯成Apache的靜態模組,用: --activate-module=src/modules/php4/libphp4.a 可是系統說我的編譯器不是ANSI 相容的。 11. 當我用 --with-apxs編譯PHP時, 我總是得到一些奇怪的錯誤。 12. 在make時, 我得到很多關於microtime錯誤, 還有許多RUSAGE_ stuff. 13. 我想升級PHP,我在哪可以看到我現在運行的PHP 的當初配置安裝時所使用的./configure 一行的內容? 14. 編譯帶GD庫的PHP時,它不是給一些奇怪的錯, 就是執行時產生segfaults 段錯誤.
1. 我用匿名CVS得到最新版的源代碼包, 但沒有配置腳本文件!
你必須安裝GNU autoconf 包,這樣可以從configure.in生成配置腳本文件. 只要運行在CVS伺服器得到源代碼的頂級目錄下的./buildconf。 (注意, 除非你運行configure --enable-maintainer-mode 選項, 配置腳本是不會重新生成, 即使configure.in 文件已更新, 所以當你發現configure.in 改變了,你也要手工做一遍. 在config或config.status 運行後應該在你的Makefile裡能看到像@VARIABLE@這樣的標號。 它說不能找到 httpd.h, 可是我看它就在那裡!
你要告訴 configure/setup 腳本 Apache 的頂級目錄的位置。 是說你要標示--with-apache=/path/to/apache , 而不是--with-apache=/path/to/apache/src.
3. 當我執行conifgure時,它說它不能找到include檔案或一些函式庫: GD, gdbm, 或其它的一些套件!
你可以看看configure 腳本,那些頭檔或非標準函式庫的位置,要送一些特殊的標誌給C預處理器。例如:
CPPFLAGS=-I/path/to/include LDFLAGS=-L/path/to/library ./configure假如你的shell使用 csh-variant , 那麼它將會是 (為什麼?):
env CPPFLAGS=-I/path/to/include LDFLAGS=-L/path/to/library ./configure
4. 我在編譯檔案language-parser.tab.c時, 出錯,提示: yytname undeclared.
你需要更新你的Bison 版本. 你可以在ftp://ftp.gnu.org/pub/gnu/bison/找到最新版本.
5. 當我運行make, 起初正常但最終失敗了,在連接最後的應用程式時,出錯說找不到一些檔案。
一些舊版的 make 不能把 functions 目錄下的編譯的檔案放到同一個目錄下, 試著執行 cp *.o functions 然後再執行 make 看看是否會好些。 如果好了,你真的應該更新你的GNU Make的版本了。
6. 在連接 PHP 時, 出一堆錯說 undefined references。
看看文件裡的連接行,確認所有的相關套件都已經正確包含。通常這樣是因為缺少'-ldl',還有一些你想支援的資料庫包。
如果你正在連接到 Apache 1.2.x, 你記得要在EXTRA_LIBS 行增加一些額外的資訊 並且重運行 Apache's Configure 腳本嗎? 參見發行包裡的 INSTALL 檔案。
很多人說他們一增加 '-ldl' 馬上得到了 libphp4.a 。
7. 我不清楚怎麼在 Apache 1.3下編譯PHP。
事實上很簡單,按下面的步驟:
取得 Apache 1.3 原始碼,在下面的位置 http://www.apache.org/dist/.
在某目錄下解壓縮出來, 如 /usr/local/src/apache-1.3.
在PHP的發行包目錄下,編譯 PHP ,./configure --with-apache=/
打入: make 然後: make install 編譯PHP,拷貝必須的檔案到Apache目錄下。
改變到你的 /
打入: ./Configure 然後: make.
這樣你就有了一個httpd 檔案!
注意:你也可以使用新的Apache ./configure 腳本. 見發行包裡的README.configure 當然也要看看PHP發行包裡的INSTALL 檔案。
8. 我依照步驟一步一步安裝了Apache模組(Unix下), 可是在瀏覽器裡開啟 PHP 腳本時它卻問我是否要儲存。
這表示你的PHP模組沒有被載入。你可從下面三點來檢查:
確認你運行的Httpd是你剛剛編譯了PHP的Httpd. 可以運行: /path/to/binary/httpd -l 如果你沒有看到mod_php4.c 列出來,那麼你運行了不正確的Httpd. 最好重新安裝它。
確認你在Apache .conf 檔案裡增加了正確的Mime 類型.它應該是這樣: AddType application/x-httpd-php3 .php3 ( PHP 3)
或AddType application/x-httpd-php . php ( PHP 4)
也保證AddType 這行沒有包括在
最後, Apache 1.2 和Apache 1.3預設的設定檔的位置是不同的. 你應該檢查你增加了AddType行的設定檔的位置. 你可以在httpd.conf 放一些明顯的錯誤或改變,這樣如果這文件被讀的話,系統會通知你。
9. 系統說使用: --activate-module=src/modules/php4/libphp4.a, 可那檔案根本不存在, 我只好改成--activate-module=src/modules/php4 /libmodphp4.a 好了,它不工作了! 該怎麼辦?
請注意libphp4.a 事實並不存在. apache 進程會創建它!
10. 我要把PHP編譯成Apache的靜態模組,用: --activate-module=src/modules/php4/libphp4.a 可是系統說我的編譯器不是ANSI 相容的。
這個錯誤訊息是 Apache 誤導的,可以用更新版本來修正它。
11. 我用 --with-apxs編譯PHP時, 我總是得到一些奇怪的錯誤。
出現這樣的情況可以從三點來檢查. 第一, 因為某種原因,Apache 在編譯apxs Perl 腳本的時候, 它沒有創建適當的標誌變量, 找到你的apxs腳本(試試命令which apxs , 通常在/usr/local/apache/bin/apxs or /usr/sbin/apxs. 打開它找到像下面這樣的行:
my $CFG_CFLAGS_SHLIB = ' '; # substituted via Makefile.tmplmy $CFG_LD_SHLIB S_SHLIB = ' '; # substituted via Makefile.tmpl如果你看到的是這樣,那麼問題就出在這裡. 因為值裡包含的是空格或其它不正確的值, 如'q()'. 把它樣變成像下面的那樣:
my $CFG_CFLAGS_SHLIB = '-fpic -DSHARED_MODULE'; # substituted via Makefile.tmplmy $CFG_LD_SHLIB .tmplmy $CFG_LDFLAGS_SHLIB = q(-shared); # substituted via Makefile.tmpl第二種可能僅出現在Red Hat 6.1 和6.2上. apxs 腳本Red Hat 版有錯. 看這行:
my $CFG_LIBEXECDIR = 'modules'; # substituted via APACI install如果你看到了,就把它改成下面的行:
my $CFG_LIBEXECDIR = '/usr/lib/apache'; # substituted via APACI install第三, 你要是重配置/重安裝Apache, 必須在./configure 後,在make之前,執行make clean
12. 在make時, 我得到很多關於microtime錯誤, 還有許多RUSAGE_ stuff.
在安裝過程中make時,如果你看到下面的錯:
microtime.c: In function `php_if_getrusage':microtime.c:94: storage size of `usg' isn't knownmicrotime.c:97: `RUSAGE_SELF' undeclared (first use in this function)microtime. undeclared identifier 是 reported only oncemicrotime.c:97: for each function it appears in.)microtime.c:103: `RUSAGE_CHILDREN' undeclared (first use in this function)make[3]: ***^microtime. 1make[3]: Leaving directory `/home/master/php-4.0.1/ext/standard'make[2]: *** [all-recursive] Error 1make[2]: Leaving directory `/home/master/ php-4.0.1/ext/standard'make[1]: *** [all-recursive] Error 1make[1]: Leaving directory `/home/master/php-4.0.1/ext'make: *** [all-recursive] Error 1
那是你的系統出錯了. 你應該修復/usr/include 文件.具體做法是安裝和你的glibc匹配的glibc-devel 包. 這些錯絕對和PHP無關,為了證明,你可以這樣做:
$ cat >test.c X$ gcc -E test.c >/dev/null如果出錯,證明你的包含檔受損了.
13. 我想升級PHP,我在哪裡可以看到我現在運行的PHP 的當初配置安裝時所使用的./configure 一行的內容.?
你可以看你安裝PHP源目錄下的config.nice 文件. 如果不行還有另外一種方法.你只要簡單運行
腳本. 在輸出頁的第一行,就是./configure 行, 是你當初用來配置PHP的那行.
14. 編譯帶GD庫的PHP時,它不是給一些奇怪的錯, 就是執行時產生segfaults 段錯誤.
你必須確認你在編譯GD 庫和PHP 時所使用同樣的依賴庫(例如libpng).