<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/faq.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'ja',
  ),
  'this' => 
  array (
    0 => 'faq.build.php',
    1 => '構築時の問題',
    2 => '構築時の問題',
  ),
  'up' => 
  array (
    0 => 'faq.php',
    1 => 'FAQ',
  ),
  'prev' => 
  array (
    0 => 'faq.installation.php',
    1 => 'インストール',
  ),
  'next' => 
  array (
    0 => 'faq.using.php',
    1 => 'PHP の使いかた',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'ja',
    'path' => 'faq/build.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="faq.build" class="chapter">
  <h1 class="title">構築時の問題</h1>

  

  <p class="para">
   本節は、構築時に発生する多くの一般的なエラーを集めたものです。
  </p>

  <div class="qandaset"><ol class="qandaset_questions"><li><a href="#faq.build.configure">
     
      anonymous Git サービスで最新版の PHP を入手しましたが、
      configure スクリプトがありません!
     
    </a></li><li><a href="#faq.build.configuring">
     
      PHPをApacheと組みあわせて動作するようにconfigureを行う際に問題が
      あります。httpd.hが見付からないといわれますが、
      指定した場所にこのファイルはあるのです!
     
    </a></li><li><a href="#faq.build.lex">
     
      PHPをconfigureしているときに (./configure)
      以下のようなエラーに遭遇しました。
     
     
      
       checking lex output file root... ./configure: lex: command not found
       configure: error: cannot find output from lex; giving up
      
     
    </a></li><li><a href="#faq.build.apache-sharedcore">
     
      Apacheを起動するときに以下のようなメッセージが出る:
     
     
      
       fatal: relocation error: file /path/to/libphp4.so:
       symbol ap_block_alarms: referenced symbol not found
      
     
    </a></li><li><a href="#faq.build.not-found">
     
      configureを実行した際、GD、gdbmまたは他のパッケージのファイルま
      たはライブラリを見つけることができないと言われます。
     
    </a></li><li><a href="#faq.build.yytname">
     
      ファイルlanguage-parser.tab.cをコンパイルする際、 &#039;yytname
      undeclared&#039;というエラーが発生します。
     
    </a></li><li><a href="#faq.build.link">
     
      makeを実行する際、実行には成功しているようですがコンパイルする
      最終的なアプリケーションをリンクしようとした際に何かファイルが見
      つからないというエラーが発生します。
     
    </a></li><li><a href="#faq.build.undefined">
     
      PHP をリンクする際、未定義の参照があるというエラーが複数発生します。
     
    </a></li><li><a href="#faq.build.not-running">
     
      インストール手順に完全に従ってUnix上でApacheモジュール版をインス
      トールしましたが、ブラウザでアクセスするとPHPスクリプトが表示さ
      れ、ファイルを保存しますかと尋ねられます。
     

    </a></li><li><a href="#faq.build.activate-module">
     
      --activate-module=src/modules/php4/libphp4.a
      と書いてありますが、ファイルがありません。このため、
      --activate-module=src/modules/php4/libmodphp4.aに
      変更しましたが、やはりだめです。何が起きているのでしょう?
     
    </a></li><li><a href="#faq.build.ansi">
     
      --activate-module=src/modules/php4/libphp4.a
      を指定し、PHPを静的モジュールとして組み込んでApacheを構築しよう
      とした際に、システムがANSI対応ではないというエラーを発生します。
     
    </a></li><li><a href="#faq.build.apxs">
     
      --with-apxs を指定して
      PHP を構築しようとした際、奇妙なエラーメッセージが出力されます。
     
    </a></li><li><a href="#faq.build.microtime">
     
      makeの間、microtimeおよび
      RUSAGE_関連で多くのエラーを発生します。
     
    </a></li><li><a href="#faq.build.mysql.tempnam">
     
      MySQLを使用できるようにPHPをコンパイルする際、configureは正常に
      実行されるがmakeの最中に以下のようなエラーが出る:
      ext/mysql/libmysqlclient/my_tempnam.o(.text+0x46): In function 
      my_tempnam&#039;: /php4/ext/mysql/libmysqlclient/my_tempnam.c:103: the 
      use of tempnam&#039; is dangerous, better use mkstemp&#039;
      何がおかしいのか？
     
    </a></li><li><a href="#faq.build.upgrade">
     
      PHPをアップグレードしたいのですが、現在インストールされているPHPを
      構築するときに指定した./configureコマンドの
      オプションはどこで知ることが出来ますか？
     
    </a></li><li><a href="#faq.build.gdlibs">
     
      GDライブラリをリンクしてPHPを構築すると、コンパイルエラーが発生したり
      実行時にセグメンテーション違反になってしまいます。
     
    </a></li><li><a href="#faq.installation.needgnu">
     
      PHP をコンパイルする際に、よくわからないエラーが発生してハングアップ
      します。Solaris を使用している場合に起こるようです。
     
    </a></li></ol></div>
   <dl class="qandaentry" id="faq.build.configure">
    <dt><strong>
     
      anonymous Git サービスで最新版の PHP を入手しましたが、
      configure スクリプトがありません!
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      configure.inからconfigureスクリプトを生成するためには、GNU
      autoconfパッケージが必要です。Gitサーバーからソースを入手した後、
      最上位のディレクトリで<strong class="command">./buildconf</strong>を実行して下
      さい。(また、<strong class="command">configure</strong> に
      <code class="literal">--enable-maintainer-mode</code>オプションを付けて実
      行した場合以外は、configureスクリプトは<var class="filename">configure.in</var>
      ファイルが更新された際に自動的に再構築を行いません。このため、
      <var class="filename">configure.in</var>が
      変更された場合には忘れずに手動で再構築を行う必要があります。
      再構築の際に行われることの１つは、configureまたは
      <var class="filename">config.status</var>を
      実行した後、Makefileの中の@VARIABLE@のような物を見つけることです。)
     </p>
    </dd>
   </dl>
   
   <dl class="qandaentry" id="faq.build.configuring">
    <dt><strong>
     
      PHPをApacheと組みあわせて動作するようにconfigureを行う際に問題が
      あります。<var class="filename">httpd.h</var>が見付からないといわれますが、
      指定した場所にこのファイルはあるのです!
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      configure/setupスクリプトにApacheソースツリーの最上位の場所を指
      定する必要があります。これは、<strong class="option configure">--with-apache=/path/to/apache</strong>
      を指定するのであった、<strong class="option configure">--with-apache=/path/to/apache/src</strong>
      <em>ではない</em>ということです。
     </p>
    </dd>
   </dl>


   <dl class="qandaentry" id="faq.build.lex">
    <dt><strong>
     
      PHPをconfigureしているときに (<code class="literal">./configure</code>)
      以下のようなエラーに遭遇しました。
     
     
      <div class="example-contents screen"><br />
       checking lex output file root... ./configure: lex: command not found<br />
       configure: error: cannot find output from lex; giving up<br />
      </div>
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      <a href="install.unix.php" class="link">インストール</a>の説明をよく読み、
      PHPのコンパイルにはflexとbisonの両方が必要であることに留意してください。
      ソースかあるいはRPMのようなパッケージからbisonとflexを
      インストールしてください。
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.build.apache-sharedcore">
    <dt><strong>
     
      Apacheを起動するときに以下のようなメッセージが出る:
     
     
      <div class="example-contents screen"><br />
       fatal: relocation error: file /path/to/libphp4.so:<br />
       symbol ap_block_alarms: referenced symbol not found<br />
      </div>
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      ApacheのcoreプログラムがsharedなDSOライブラリとして
      コンパイルされている場合にこのエラーが出ます。
      最低でも以下のフラグを使用してApacheを再configureして
      ください:
     </p>
     <p class="para">
      <div class="example-contents screen"><br />
      --enable-shared=max --enable-rule=SHARED_CORE<br />
      </div>
     </p>
     <p class="para">
      詳細はApacheのソースディレクトリのトップレベルにある
      <var class="filename">INSTALL</var>ファイル またはApacheの
      <a href="http://httpd.apache.org/docs/current/dso.html" class="link external">&raquo;&nbsp;DSO manual page</a>をご覧ください。
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.build.not-found">
    <dt><strong>
     
      configureを実行した際、GD、gdbmまたは他のパッケージのファイルま
      たはライブラリを見つけることができないと言われます。
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Cプリプロセッサおよびリンカに次のように追加でフラグを指定するこ
      とにより、configureスクリプトがヘッダファイルまたはライブラリを
      標準以外の場所で探すことが可能となります。
      <div class="example-contents">
<div class="cdata"><pre>
    CPPFLAGS=-I/path/to/include LDFLAGS=-L/path/to/library ./configure
</pre></div>
      </div>

      ログインシェルとしてcsh系のシェルを使用している場合、次のように
      なります。
      <div class="example-contents">
<div class="cdata"><pre>
    env CPPFLAGS=-I/path/to/include LDFLAGS=-L/path/to/library ./configure
</pre></div>
      </div>

     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.build.yytname">
    <dt><strong>
     
      ファイル<var class="filename">language-parser.tab.c</var>をコンパイルする際、 &#039;yytname
      undeclared&#039;というエラーが発生します。
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      bisonのバージョンを更新する必要があります。最新版は、
      <a href="http://www.gnu.org/software/bison/bison.html" class="link external">&raquo;&nbsp;http://www.gnu.org/software/bison/bison.html</a>にあります。
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.build.link">
    <dt><strong>
     
      <strong class="command">make</strong>を実行する際、実行には成功しているようですがコンパイルする
      最終的なアプリケーションをリンクしようとした際に何かファイルが見
      つからないというエラーが発生します。
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      古いバージョンのmakeには、functionsディレクトリにあるファイルの
      コンパイルされたものを同じディレクトリに正しく入れないものがあり
      ます。<strong class="command">cp *.o functions</strong>を試しに実行してから
      <strong class="command">make</strong> を再度実行し、解決されるか確認して下さ
      い。解決される場合には、GNU makeの最近のバージョンに更新するべき
      です。
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.build.undefined">
    <dt><strong>
     
      PHP をリンクする際、未定義の参照があるというエラーが複数発生します。
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      最後に適切なライブラリが全てインクルードされているかどうか
      確認してください。よくあるのは、&#039;-ldl&#039; や
      指定したデータベースのサポート機能に必要なライブラリの指定が欠けているというものです。
     </p>
     <p class="para">
      何名かの人から、Apache とリンクする際に
      &#039;<var class="filename">libphp4.a</var>&#039; の直後に &#039;-ldl&#039;
      を追加する必要があることも報告されています。
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.build.not-running">
    <dt><strong>
     
      インストール手順に完全に従ってUnix上でApacheモジュール版をインス
      トールしましたが、ブラウザでアクセスするとPHPスクリプトが表示さ
      れ、ファイルを保存しますかと尋ねられます。
     

    </strong></dt>
    <dd class="answer">
     <p class="para">
      これは、何らかの理由によりPHPモジュールが起動していないことを意
      味しています。助けを求める質問を行う前にまず以下を確認ください。
      <ul class="itemizedlist">
       <li class="listitem">
        <span class="simpara">
         実行しているhttpdバイナリが構築したばかりの新しいhttpdバイナ
         リであることを確認してください。確認を行うには以下のように入力
         します。
         <code class="literal">/path/to/binary/httpd -l</code>
        </span>
        <span class="simpara">
         <var class="filename">mod_php4.c</var> がリストの中にない場合、正し
         いバイナリが実行されていません。正しいバイナリを見つけて、イ
         ンストールしてください。
        </span>
       </li>
       <li class="listitem">
        <span class="simpara">
       <code class="literal">Apache .conf</code> ファイルの１つに正しいMIME型
         が追加されていることを確認してください。これは以下のようになります。
         <code class="literal">AddType application/x-httpd-php .php</code>
        </span>
        <span class="simpara"> 
         また、このAddTypeの行が、
         &lt;Virtualhost&gt; または &lt;Directory&gt; ブロックの中に隠
         されて、テスト用のスクリプトの場所に適用できていないようなこ
         とがないことを確認してください。
        </span>
       </li>
       <li class="listitem">
        <span class="simpara">
         最後に、デフォルトのApache設定ファイルの場所はApache 1.2と
         Apache 1.3の間で変更されています。AddTypeの行を追加した設定ファ
         イルが実際に読み込まれていることを確認してください。このファイ
         ルが正しく読み込まれている場合には、明らかな構文エラーを
         httpd.confファイルの中に書き込んでしまったり、何らかの明らか
         な変更があった可能性があります。
        </span>
       </li>
      </ul>
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.build.activate-module">
    <dt><strong>
     
      <code class="literal">--activate-module=src/modules/php4/libphp4.a</code>
      と書いてありますが、ファイルがありません。このため、
      <code class="literal">--activate-module=src/modules/php4/libmodphp4.a</code>に
      変更しましたが、やはりだめです。何が起きているのでしょう?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      libphp4.aファイルはこの時点では存在しない、ということに気をつけてください。
      このファイルは、Apacheの構築時に自動的に作成されます。
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.build.ansi">
    <dt><strong>
     
      <code class="literal">--activate-module=src/modules/php4/libphp4.a</code>
      を指定し、PHPを静的モジュールとして組み込んでApacheを構築しよう
      とした際に、システムがANSI対応ではないというエラーを発生します。
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Apacheのこのエラーメッセージは紛らわしく、より新しいバージョンで
      は修整されています。
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.build.apxs">
    <dt><strong>
     
      <strong class="option configure">--with-apxs</strong> を指定して
      PHP を構築しようとした際、奇妙なエラーメッセージが出力されます。
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      ここでは、確認すべきことが3点あります。まず、何らかの理由により、
      Apacheがapxs Perlスクリプトを構築する際に適当なコンパイラやフラ
      グ変数を付けないで構築されてしまうことが時々あります。
      使用するapxsの場所を見つけたら(<strong class="command">which apxs</strong>コマンドを
      試してみてください。<var class="filename">/usr/local/apache/bin/apxs</var>
      または<var class="filename">/usr/sbin/apxs</var>等にあります)、
      以下の行を確認してください。
      <div class="example-contents">
<div class="cdata"><pre>
my $CFG_CFLAGS_SHLIB  = &#039; &#039;;          # substituted via Makefile.tmpl
my $CFG_LD_SHLIB      = &#039; &#039;;          # substituted via Makefile.tmpl
my $CFG_LDFLAGS_SHLIB = &#039; &#039;;          # substituted via Makefile.tmpl
</pre></div>
      </div>

      上記のようになっている場合は問題です。これらの行は空白になっているか
      &#039;q()&#039;のような正しくない値になっていると思います。これを以下のように
      変更してください。
      <div class="example-contents">
<div class="cdata"><pre>
my $CFG_CFLAGS_SHLIB  = &#039;-fpic -DSHARED_MODULE&#039;; # substituted via Makefile.tmpl
my $CFG_LD_SHLIB      = &#039;gcc&#039;;                   # substituted via Makefile.tmpl
my $CFG_LDFLAGS_SHLIB = q(-shared);              # substituted via Makefile.tmpl 
</pre></div>
      </div>

      可能性のある第2の問題は、RedHat-6.1と6.2でのみ存在する問題です。
      RedHatが出荷した apxs スクリプトは壊れています。以下の行を見てください。
      <div class="example-contents">
<div class="cdata"><pre>
my $CFG_LIBEXECDIR    = &#039;modules&#039;;         # substituted via APACI install
</pre></div>
      </div>

      上の行がある場合、これを次のように変更してください。
      <div class="example-contents">
<div class="cdata"><pre>
my $CFG_LIBEXECDIR    = &#039;/usr/lib/apache&#039;; # substituted via APACI install
</pre></div>
      </div>

      最後に、Apacheのconfigure/再インストールを行います。その際、
      <strong class="command">./configure</strong> と<strong class="command">make</strong>の間に
      <strong class="command">make clean</strong>を行ってください。
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.build.microtime">
    <dt><strong>
     
      <strong class="command">make</strong>の間、microtimeおよび
      <code class="literal">RUSAGE_</code>関連で多くのエラーを発生します。
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      インストール時に<strong class="command">make</strong>を行っている際、以下のようなエラーを発生す
      るとした場合、
      <div class="example-contents">
<div class="cdata"><pre>
microtime.c: In function `php_if_getrusage&#039;:
microtime.c:94: storage size of `usg&#039; isn&#039;t known
microtime.c:97: `RUSAGE_SELF&#039; 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&#039; undeclared (first use in this function)
make[3]: *** [microtime.lo] Error 1
make[3]: Leaving directory `/home/master/php-4.0.1/ext/standard&#039;
make[2]: *** [all-recursive] Error 1
make[2]: Leaving directory `/home/master/php-4.0.1/ext/standard&#039;
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/home/master/php-4.0.1/ext&#039;
make: *** [all-recursive] Error 1
</pre></div>
      </div>

     </p>
     <p class="para">
      あなたのシステムは壊れています。使用しているglibcと同じバージョンの
      glibc-develパッケージをインストールして、/usr/include ファイルを修正
      する必要があります。この問題は、PHPの動作とは全く関係ありません。
      これを示すには、次のような簡単なテストを行ってみてください。
     <div class="example-contents">
<div class="cdata"><pre>
$ cat &gt;test.c &lt;&lt;X
#include &lt;sys/resource.h&gt;
X
$ gcc -E test.c &gt;/dev/null
</pre></div>
      </div>

      これが、エラーが発生する場合、インクルードファイルが見つからない
      ことがわかります。
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.build.mysql.tempnam">
    <dt><strong>
     
      MySQLを使用できるようにPHPをコンパイルする際、configureは正常に
      実行されるが<code class="literal">make</code>の最中に以下のようなエラーが出る:
      <em>ext/mysql/libmysqlclient/my_tempnam.o(.text+0x46): In function 
      my_tempnam&#039;: /php4/ext/mysql/libmysqlclient/my_tempnam.c:103: the 
      use of tempnam&#039; is dangerous, better use mkstemp&#039;</em>
      何がおかしいのか？
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      まず、これは<code class="literal">Warning</code>であって致命的な
      エラーではないと認識することが重要です。<code class="literal">make</code>の
      最後のほうでこの出力がしばしば見られるため致命的なエラーと
      思われがちですがそうではありません。もちろん、Warningが
      起きるとコンパイラが停止するような設定をしている場合は別です。
      また、MySQLサポートはデフォルトで構築されることにも
      留意してください。
     </p>
     <blockquote class="note"><p><strong class="note">注意</strong>: 
      <p class="para">
       PHP4.3.2以降、ビルド(make)完了後に以下のようなテキストが出る
       ことがあります:
      </p>
      <p class="para">
       <div class="example-contents screen"><br />
        Build complete.<br />
        (It is safe to ignore warnings about tempnam and tmpnam).<br />
       </div>
      </p>
     </p></blockquote>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.build.upgrade">
    <dt><strong>
     
      PHPをアップグレードしたいのですが、現在インストールされているPHPを
      構築するときに指定した<strong class="command">./configure</strong>コマンドの
      オプションはどこで知ることが出来ますか？
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      現在インストールされているPHPを構築した時のディレクトリにある
      config.nice ファイルを見るか、もしもうそのディレクトリが無い場合は
      <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php phpinfo</span><span style="color: #007700">(); </span><span style="color: #0000BB">?&gt;</span></span></code></div>
      </div>

      というスクリプトを実行すれば、最初の方にある<strong class="command">./configure</strong>
      という箇所に表示されます。
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.build.gdlibs">
    <dt><strong>
     
      GDライブラリをリンクしてPHPを構築すると、コンパイルエラーが発生したり
      実行時にセグメンテーション違反になってしまいます。
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      リンクしたGDライブラリとPHPが同じライブラリ(例えばlibpng)に依存しているか
      どうかを確認してください。
     </p>
    </dd>
   </dl>
   
   <dl class="qandaentry" id="faq.installation.needgnu">
    <dt><strong>
     
      PHP をコンパイルする際に、よくわからないエラーが発生してハングアップ
      します。Solaris を使用している場合に起こるようです。
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      PHP のコンパイル時に 非 GNU ツールを使用すると問題を引き起こします。
      PHP を正しくコンパイルするには、GNU ツールを使用することを忘れないで
      ください。たとえば、Solaris で使用される SunOS BSD 互換の <code class="literal">sed</code>
      や Solaris 版の <code class="literal">sed</code> は正しく動作しません。しかし、
      GNU 版もしくは Sun POSIX (xpg4) 版の <code class="literal">sed</code> ならうまく
      動きます。以下を参照ください。
      <a href="http://www.gnu.org/software/sed/sed.html" class="link external">&raquo;&nbsp;GNU sed</a>、
      <a href="http://www.gnu.org/software/flex/flex.html" class="link external">&raquo;&nbsp;GNU flex</a> および
      <a href="http://www.gnu.org/software/bison/bison.html" class="link external">&raquo;&nbsp;GNU bison</a> 。
     </p>
    </dd>
   </dl>
  
 </div>
<?php manual_footer($setup); ?>