<?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 => 'ru',
  ),
  'this' => 
  array (
    0 => 'faq.build.php',
    1 => 'Проблемы сборки',
    2 => 'Проблемы сборки',
  ),
  'up' => 
  array (
    0 => 'faq.php',
    1 => 'ЧАВО',
  ),
  'prev' => 
  array (
    0 => 'faq.installation.php',
    1 => 'Установка',
  ),
  'next' => 
  array (
    0 => 'faq.using.php',
    1 => 'Использование PHP',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'ru',
    '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">
    
     Я получил последнюю версию PHP, используя анонимный доступ к Git,
     но в нём нет конфигурационного скрипта!
    
   </a></li><li><a href="#faq.build.configuring">
    
     У меня возникают проблемы при конфигурировании PHP для работы с Apache.
     Он говорит, что не может найти httpd.h,
     хотя файл находится точно там, где я сказал!
    
   </a></li><li><a href="#faq.build.lex">
    
     Во время конфигурации PHP (./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, он говорит, что не может найти файлы
     include или библиотеку для GD, gdbm или какого-либо другого пакета!
    
   </a></li><li><a href="#faq.build.yytname">
    
     При компиляции файла language-parser.tab.c
     мне выдаются ошибки, говорящие yytname undeclared.
    
   </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">
    
     Я следовал всем шагам по установке модульной версии для Apache на Unix,
     но мои 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">
    
     Когда я пытаюсь собрать Apache c PHP в виде статического модуля,
     используя --activate-module=src/modules/php4/libphp4.a
     он говорит, что мой компилятор не ANSI-совместимый.
    
   </a></li><li><a href="#faq.build.apxs">
    
     Когда я пытаюсь собрать PHP с помощью --with-apxs,
     я получаю странное сообщение об ошибке.
    
   </a></li><li><a href="#faq.build.microtime">
    
     Во время выполнения make я очень быстро получаю
     ошибки и множество всяких RUSAGE_.
    
   </a></li><li><a href="#faq.build.mysql.tempnam">
    
     При компиляции PHP с MySQL, 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. Где я могу найти строку
     ./configure, которая была использована для моей
     текущей PHP установки?
    
   </a></li><li><a href="#faq.build.gdlibs">
    
     При сборке PHP с библиотекой GD, либо выдаются странные ошибки
     компиляции, либо ошибки сегментации (segfaults) при выполнении.
    
   </a></li><li><a href="#faq.installation.needgnu">
    
     При компиляции PHP я, кажется, получаю случайные ошибки, например она
     зависает. Я использую Solaris, если это имеет значение.
    
   </a></li></ol></div>
  <dl class="qandaentry" id="faq.build.configure">
   <dt><strong>
    
     Я получил последнюю версию PHP, используя анонимный доступ к Git,
     но в нём нет конфигурационного скрипта!
    
   </strong></dt>
   <dd class="answer">
    <p class="para">
     Вам нужен установленный пакет GNU autoconf для того, чтобы сгенерировать
     конфигурационный скрипт из <var class="filename">configure.in</var>.
     После получения исходников с Git сервера просто запустите
     <strong class="command">./buildconf</strong> в директории верхнего уровня.
     (Также, если вы запускаете <strong class="command">configure</strong> без опции
     <code class="literal">--enable-maintainer-mode</code>, то конфигурационный
     скрипт не будет перестроен автоматически при изменении файла
     <var class="filename">configure.in</var>, поэтому вам необходимо делать это
     вручную, когда вы заметите, что <var class="filename">configure.in</var> изменился.
     Один из симптомов - появление таких вещей как @VARIABLE@ в вашем Makefile
     после выполнения configure или <var class="filename">config.status</var>.)
    </p>
   </dd>
  </dl>

  <dl class="qandaentry" id="faq.build.configuring">
   <dt><strong>
    
     У меня возникают проблемы при конфигурировании PHP для работы с Apache.
     Он говорит, что не может найти <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>,
     а <em>не</em>
     <strong class="option configure">--with-apache=/path/to/apache/src</strong>.
    </p>
   </dd>
  </dl>

  <dl class="qandaentry" id="faq.build.lex">
   <dt><strong>
    
     Во время конфигурации PHP (<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.
     В зависимости от ваших настроек, установите bison и flex либо из
     исходников, либо из пакетов, например, RPM.
    </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 было скомпилировано как
     разделяемая библиотека DSO (Dynamic Shared Object). Попробуйте
     переконфигурировать Apache, используя, по крайней мере, следующие флаги:
    </p>
    <p class="para">
     <div class="example-contents screen"><br />
      --enable-shared=max --enable-rule=SHARED_CORE<br />
     </div>
    </p>
    <p class="para">
     Для более подробной информации читайте файл <var class="filename">INSTALL</var>
     в директории верхнего уровня или <a href="http://httpd.apache.org/docs/current/dso.html" class="link external">&raquo;&nbsp;
     страницу руководства Apache по DSO</a>.
    </p>
   </dd>
  </dl>

  <dl class="qandaentry" id="faq.build.not-found">
   <dt><strong>
    
     Когда я запускаю configure, он говорит, что не может найти файлы
     include или библиотеку для GD, gdbm или какого-либо другого пакета!
    
   </strong></dt>
   <dd class="answer">
    <p class="para">
     Вы можете сделать так, что скрипт 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>
     мне выдаются ошибки, говорящие <code class="literal">yytname undeclared</code>.
    
   </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;-ldl&#039; сразу после <var class="filename">libphp4.a</var>.
    </p>
   </dd>
  </dl>

  <dl class="qandaentry" id="faq.build.not-running">
   <dt><strong>
    
     Я следовал всем шагам по установке модульной версии для Apache на Unix,
     но мои 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">
        Убедитесь, что вы добавили правильный Mime Type в один из ваших
        <code class="literal">Apache .conf</code>
        файлов. Это должно быть: <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 1.2 и Apache 1.3 расположение конфигурационных
        файлов Apache по умолчанию изменилось. Вам надо проверить, что
        действительно читается тот конфигурационный файл, в который вы
        добавили строку AddType. Вы можете внести очевидную синтаксическую
        ошибку в ваш <var class="filename">httpd.conf</var> файл или какое-либо другое заметное
        изменение, которое покажет вам, что читается правильный файл.
       </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">
     Заметьте, что файл <var class="filename">libphp4.a</var> не должен
     существовать.
     Он будет создан в процессе!
    </p>
   </dd>
  </dl>

  <dl class="qandaentry" id="faq.build.ansi">
   <dt><strong>
    
     Когда я пытаюсь собрать Apache c PHP в виде статического модуля,
     используя <code class="literal">--activate-module=src/modules/php4/libphp4.a</code>
     он говорит, что мой компилятор не ANSI-совместимый.
    
   </strong></dt>
   <dd class="answer">
    <p class="para">
     Сообщение об ошибке вводит в заблуждение; это исправлено в более
     свежих версиях Apache.
    </p>
   </dd>
  </dl>

  <dl class="qandaentry" id="faq.build.apxs">
   <dt><strong>
    
     Когда я пытаюсь собрать PHP с помощью <strong class="option configure">--with-apxs</strong>,
     я получаю странное сообщение об ошибке.
    
   </strong></dt>
   <dd class="answer">
    <p class="para">
     Проверьте три вещи. Во-первых, по какой-то причине, когда Apache
     создаёт Perl скрипт apxs, он получается без правильного компилятора и
     переменных, задающих флаги.
     Найдите ваш 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>

     Вторая возможная проблема возникает только на Red Hat 6.1 и 6.2.
     Скрипт apxs, поставляемый с Red Hat, сломан. Ищите эту строку:
     <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,
     запустите <strong class="command">make clean</strong> после <strong class="command">./configure</strong>
     и перед <strong class="command">make</strong>.
    </p>
   </dd>
  </dl>

  <dl class="qandaentry" id="faq.build.microtime">
   <dt><strong>
    
     Во время выполнения <strong class="command">make</strong> я очень быстро получаю
     ошибки и множество всяких <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">
     Ваша система сломана. Вы должны исправить ваши файлы
     <var class="filename">/usr/include</var>, установив пакет glibc-devel,
     который соответствует вашей glibc. Это абсолютно не зависит от 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>

     Если выдаются ошибки, то ваши include файлы испорчены.
    </p>
   </dd>
  </dl>

  <dl class="qandaentry" id="faq.build.mysql.tempnam">
   <dt><strong>
    
     При компиляции PHP с MySQL, 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>, оно может выглядеть как фатальная ошибка,
     но это не так. Конечно, если ваш компилятор умирает на предупреждениях,
     (Warnings), то тогда да. Также имейте ввиду, что поддержка MySQL
     включена по умолчанию.
    </p>
    <blockquote class="note"><p><strong class="note">Замечание</strong>: 
     <p class="para">
      Начиная с PHP 4.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 />
       (Сборка завершена, можно безопасно игнорировать<br />
       предупреждения о tempnam и tmpnam.)<br />
      </div>
     </p>
    </p></blockquote>
   </dd>
  </dl>

  <dl class="qandaentry" id="faq.build.upgrade">
   <dt><strong>
    
     Я хочу обновить мой PHP. Где я могу найти строку
     <strong class="command">./configure</strong>, которая была использована для моей
     текущей PHP установки?
    
   </strong></dt>
   <dd class="answer">
    <p class="para">
     Либо смотрите файл config.nice в дереве исходников вашей текущей PHP
     установки, либо, если это недоступно, просто выполните скрипт:
     <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>,
     которая была использована для сборки текущего PHP.
    </p>
   </dd>
  </dl>

  <dl class="qandaentry" id="faq.build.gdlibs">
   <dt><strong>
    
     При сборке PHP с библиотекой GD, либо выдаются странные ошибки
     компиляции, либо ошибки сегментации (segfaults) при выполнении.
    
   </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">
     Использование не GNU утилит во время компиляции PHP может вызвать
     проблемы.
     Чтобы быть уверенным, что компиляция PHP будет работать,
     используйте GNU утилиты. Например, в Solaris, использование
     SunOS BSD-совместимой или 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>, and
     <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); ?>