第 54章構築時の問題

本節では、構築時に発生する多くの一般的なエラーを集めたものです。

1. anonymous CVS サービスにより最新版の PHP を入手しましたが、 configure スクリプトがありません!
2. PHPをApacheと組みあわせて動作するようにconfigureを行う際に問題が あります。httpd.hが見付からないといわれますが、 指定した場所にこのファイルはあるのです!
3. PHPをconfigureしているときに (./configure) 以下のようなエラーに遭遇しました。
4. Apacheを起動するときに以下のようなメッセージが出る:
5. configureを実行した際、GD、gdbmまたは他のパッケージのファイルま たはライブラリを見つけることができないと言われます。
6. ファイルlanguage-parser.tab.cをコンパイルする際、 'yytname undeclared'というエラーが発生します。
7. makeを実行する際、実行には成功しているようですがコンパイルする 最終的なアプリケーションをリンクしようとした際に何かファイルが見 つからないというエラーが発生します。
8. PHP をリンクする際、未定義の参照があるというエラーが複数発生します。
9. PHPをApache 1.3と組み合わせて構築する手法が分かりません。
10. インストール手順に完全に基づきUnix上でApacheモジュール版をインス トールしましたが、ブラウザでアクセスするとPHPスクリプトが表示さ れ、ファイルを保存しますかと尋ねられます。
11. --activate-module=src/modules/php4/libphp4.a と書いてありますが、ファイルがありません。このため、 --activate-module=src/modules/php4/libmodphp4.aに 変更しましたが、やはりだめです。何が起きているのでしょう?
12. --activate-module=src/modules/php4/libphp4.a を指定し、PHPを静的モジュールとして組み込んでApacheを構築しよう とした際に、システムがANSI対応ではないというエラーを発生します。
13. --with-apxs を指定して PHP を構築しようとした際、奇妙なエラーメッセージが出力されます。
14. makeの間、microtimeおよび RUSAGE_関連で多くのエラーを発生します。
15. MySQLを使用できるようにPHPをコンパイルする際、configureは正常に 実行されるがmakeの最中に以下のようなエラーが出る: ext/mysql/libmysql/my_tempnam.o(.text+0x46): In function my_tempnam': /php4/ext/mysql/libmysql/my_tempnam.c:103: the use of tempnam' is dangerous, better use mkstemp' 何がおかしいのか?
16. PHPをアップグレードしたいのですが、現在インストールされているPHPを 構築するときに指定した./configureコマンドの オプションはどこで知ることが出来ますか?
17. GDライブラリをリンクしてPHPを構築すると、コンパイルエラーが発生したり 実行時にセグメンテーション違反になってしまいます。
18. PHP をコンパイルする際に、よくわからないエラーが発生してハングアップ します。Solaris を使用している場合に起こるようです。

1. anonymous CVS サービスにより最新版の PHP を入手しましたが、 configure スクリプトがありません!

configure.inからconfigureスクリプトを生成するためには、GNU autoconfパッケージが必要です。CVSサーバからソースを入手した後、 最上位のディレクトリで./buildconfを実行して下 さい。(また、configureに --enable-maintainer-modeオプションを付けて実 行した場合以外は、configureスクリプトはconfigure.in ファイルが更新された際に自動的に再構築を行いません。このため、 configure.inが 変更された場合には忘れずに手動で再構築を行う必要があります。 再構築の際に行われることの1つは、configureまたは config.statusを 実行した後、Makefileの中の@VARIABLE@のような物を見つけることです。)

2. PHPをApacheと組みあわせて動作するようにconfigureを行う際に問題が あります。httpd.hが見付からないといわれますが、 指定した場所にこのファイルはあるのです!

configure/setupスクリプトにApacheソースツリーの最上位の場所を指 定する必要があります。これは、--with-apache=/path/to/apache を指定するのであった、--with-apache=/path/to/apache/src ではないということです。

3. PHPをconfigureしているときに (./configure) 以下のようなエラーに遭遇しました。

checking lex output file root... ./configure: lex: command not found
       configure: error: cannot find output from lex; giving up

インストールの説明をよく読み、 PHPのコンパイルにはflexとbisonの両方が必要であることに留意してください。 そーすかあるいはRPMのようなパッケージからbisonとflexを インストールしてください。

4. Apacheを起動するときに以下のようなメッセージが出る:

fatal: relocation error: file /path/to/libphp4.so:
       symbol ap_block_alarms: referenced symbol not found

ApacheのcoreプログラムがsharedなDSOライブラリとして コンパイルされている場合にこのエラーが出ます。 最低でも以下のフラグを使用してApacheを再configureして ください:

--enable-shared=max --enable-rule=SHARED_CORE

詳細はApacheのソースディレクトリのトップレベルにある INSTALLファイル またはApacheの DSO manual pageをご覧ください。

5. configureを実行した際、GD、gdbmまたは他のパッケージのファイルま たはライブラリを見つけることができないと言われます。

Cプリプロセッサおよびリンカに次のように追加でフラグを指定するこ とにより、configureスクリプトがヘッダファイルまたはライブラリを 標準以外の場所で探すことが可能となります。
CPPFLAGS=-I/path/to/include LDFLAGS=-L/path/to/library ./configure
ログインシェルとしてcsh系のシェルを使用している場合、次のように なります。
env CPPFLAGS=-I/path/to/include LDFLAGS=-L/path/to/library ./configure

6. ファイルlanguage-parser.tab.cをコンパイルする際、 'yytname undeclared'というエラーが発生します。

bisonのバージョンを更新する必要があります。最新版は、 http://www.gnu.org/software/bison/bison.htmlにあります。

7. makeを実行する際、実行には成功しているようですがコンパイルする 最終的なアプリケーションをリンクしようとした際に何かファイルが見 つからないというエラーが発生します。

古いバージョンのmakeには、functionsディレクトリにあるファイルの コンパイルされたものを同じディレクトリに正しく入れないものがあり ます。cp *.o functionsを試しに実行してから make を再度実行し、解決されるか確認して下さ い。解決される場合には、GNU makeの最近のバージョンに更新するべき です。

8. PHP をリンクする際、未定義の参照があるというエラーが複数発生します。

最後に適切なライブラリが全てインクルードされているかどうか 確認してください。よくあるのは、'-ldl' や 指定したデータベースのサポート機能に必要なライブラリの指定が欠けているというものです。

Apache 1.2.x とリンクする場合には、適当な情報を Configuration ファイルの EXTRA_LIBS の行に追加し、Apache の Configure スクリプトを 再度実行したかどうかを確認してください。より詳細な情報については、 インストールの章 を参照ください。

何名かの人から、Apache とリンクする際に 'libphp4.a' の直後に '-ldl' を追加する必要があることも報告されています。

9. PHPをApache 1.3と組み合わせて構築する手法が分かりません。

この手順は実際には非常に簡単です。以下の手順に注意深く従って下さ い。

  • http://www.apache.org/dist/httpd/から最新 のApache 1.3配布ファイルを取得してください。

  • これをどこか、例えば、 /usr/local/src/apache-1.3で ungzip、untarしてください。

  • まず、 ./configure --with-apache=/<path>/apache-1.3を実行し、PHP をコンパイルしてください。 (<path> の部分は実際のapache-1.3ディレクトリのパスに置 き換えてください)

  • make を実行した後、make installを実行してください。これにより、PHPが構築され、 必要なファイルがApacheのソースツリーにコピーされます。

  • ディレクトリを /<path>/apache-1.3/srcに移動し、 Configurationファイルを編集してください。 このファイルに以下を追加してください。: AddModule modules/php4/libphp4.a

  • ./configure を実行した後、 makeを実行してください。

  • 以上の手順によりPHP対応のhttpdバイナリが構築できました。

注意: : Apache の新しい ./configureスクリプトを使用することも可能です。 Apache配布ファイルのREADME.configureファイル の指示を参照ください。また、PHP配布ファイルの INSTALL ファイルも参照ください。

10. インストール手順に完全に基づきUnix上でApacheモジュール版をインス トールしましたが、ブラウザでアクセスするとPHPスクリプトが表示さ れ、ファイルを保存しますかと尋ねられます。

これは、何らかの理由によりPHPモジュールが起動していないことを意 味しています。助けを求める質問を行う前にまず以下を確認ください。

  • 実行しているhttpdバイナリが構築したばかりの新しいhttpdバイナ リであることを確認してください。確認を行うには以下のように入力 します。 /path/to/binary/httpd -l

    mod_php4.c がリストの中にない場合、正し いバイナリが実行されていません。正しいバイナリを見つけて、イ ンストールしてください。

  • Apache .conf ファイルの1つに正しいMIME型 が追加されていることを確認してください。これは以下のようになり ます。 AddType application/x-httpd-php3 .php3 (PHP 3の場合)

    または AddType application/x-httpd-php .php (PHP 4の場合)

    また、このAddTypeの行が、 <Virtualhost> または <Directory> ブロックの中に隠 されて、テスト用のスクリプトの場所に適用できていないようなこ とがないことを確認してください。

  • 最後に、デフォルトのApache設定ファイルの場所はApache 1.2と Apache 1.3の間で変更されています。AddTypeの行を追加した設定ファ イルが実際に読み込まれていることを確認してください。このファイ ルが正しく読み込まれている場合には、明らかな構文エラーを httpd.confファイルの中に書き込んでしまったり、何らかの明らか な変更があった可能性があります。

11. --activate-module=src/modules/php4/libphp4.a と書いてありますが、ファイルがありません。このため、 --activate-module=src/modules/php4/libmodphp4.aに 変更しましたが、やはりだめです。何が起きているのでしょう?

libphp4.aファイルはこの時点では存在しない、ということに気をつけてください。 このファイルは、Apacheの構築時に自動的に作成されます。

12. --activate-module=src/modules/php4/libphp4.a を指定し、PHPを静的モジュールとして組み込んでApacheを構築しよう とした際に、システムがANSI対応ではないというエラーを発生します。

Apacheのこのエラーメッセージは紛らわしく、より新しいバージョンで は修整されています。

13. --with-apxs を指定して PHP を構築しようとした際、奇妙なエラーメッセージが出力されます。

ここでは、確認すべきことが3点あります。まず、何らかの理由により、 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
上記のようになっている場合は問題です。これらの行は空白になっているか 'q()'のような正しくない値になっていると思います。これを以下のように 変更してください。
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
可能性のある第2の問題は、RedHat-6.1と6.2でのみ存在する問題です。 RedHatが出荷した apxs スクリプトは壊れています。以下の行を見てください。
my $CFG_LIBEXECDIR    = 'modules';         # substituted via APACI install
上の行がある場合、これを次のように変更してください。
my $CFG_LIBEXECDIR    = '/usr/lib/apache'; # substituted via APACI install
最後に、Apacheのconfigure/再インストールを行います。その際、 ./configuremakeの間に make cleanを行ってください。

14. makeの間、microtimeおよび 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
これが、エラーが発生する場合、インクルードファイルが見つからない ことがわかります。

15. MySQLを使用できるようにPHPをコンパイルする際、configureは正常に 実行されるがmakeの最中に以下のようなエラーが出る: ext/mysql/libmysql/my_tempnam.o(.text+0x46): In function my_tempnam': /php4/ext/mysql/libmysql/my_tempnam.c:103: the use of tempnam' is dangerous, better use mkstemp' 何がおかしいのか?

まず、これはWarningであって致命的な エラーではないと認識することが重要です。makeの 最後のほうでこの出力がしばしば見られるため致命的なエラーと 思われがちですがそうではありません。もちろん、Warningが 起きるとコンパイラが停止するような設定をしている場合は別です。 また、MySQLサポートはデフォルトで構築されることにも 留意してください。

注意: PHP4.3.2以降、ビルド(make)完了後に以下のようなテキストが出る ことがあります:

Build complete.
        (It is safe to ignore warnings about tempnam and tmpnam).

16. PHPをアップグレードしたいのですが、現在インストールされているPHPを 構築するときに指定した./configureコマンドの オプションはどこで知ることが出来ますか?

現在インストールされているPHPを構築した時のディレクトリにある config.nice ファイルを見るか、もしもうそのディレクトリが無い場合は
<?php phpinfo(); ?>
というスクリプトを実行すれば、最初の方にある./configure という箇所に表示されます。

17. GDライブラリをリンクしてPHPを構築すると、コンパイルエラーが発生したり 実行時にセグメンテーション違反になってしまいます。

リンクしたGDライブラリとPHPが同じライブラリ(例えばlibpng)に依存しているか どうかを確認してください。

18. PHP をコンパイルする際に、よくわからないエラーが発生してハングアップ します。Solaris を使用している場合に起こるようです。

PHP のコンパイル時に 非 GNU ツールを使用すると問題を引き起こします。 PHP を正しくコンパイルするには、GNU ツールを使用することを忘れないで ください。たとえば、Solaris で使用される SunOS BSD 互換の sed や Solaris 版の sed は正しく動作しません。しかし、 GNU 版もしくは Sun POSIX (xpg4) 版の sed ならうまく 動きます。以下を参照ください。 GNU sedGNU flex および GNU bison