1
0
mirror of https://github.com/php/doc-ru.git synced 2026-04-27 09:18:07 +02:00
Files
archived-doc-ru/faq/build.xml
T
Sergey Panteleev daef8df962 Обнуление тега Reviewed (#364)
[skip-lint]
[skip-spellcheck]
2021-11-16 13:03:53 +03:00

496 lines
22 KiB
XML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: b8e1b1357def73f310c9f7405035b3acc0cb1eaf Maintainer: shein Status: ready -->
<!-- Reviewed: no -->
<chapter xml:id="faq.build" xmlns="http://docbook.org/ns/docbook"
xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Проблемы сборки</title>
<titleabbrev>Проблемы сборки</titleabbrev>
<para>
В этом разделе собраны наиболее общие ошибки, возникающие на этапе сборки.
</para>
<qandaset>
<qandaentry xml:id="faq.build.configure">
<question>
<para>
Я получил последнюю версию PHP, используя анонимный доступ к Git,
но в нём нет конфигурационного скрипта!
</para>
</question>
<answer>
<para>
Вам нужен установленный пакет GNU autoconf для того, чтобы сгенерировать
конфигурационный скрипт из <filename>configure.in</filename>.
После получения исходников с Git сервера просто запустите
<command>./buildconf</command> в директории верхнего уровня.
(Также, если вы запускаете <command>configure</command> без опции
<literal>--enable-maintainer-mode</literal>, то конфигурационный
скрипт не будет перестроен автоматически при изменении файла
<filename>configure.in</filename>, поэтому вам необходимо делать это
вручную, когда вы заметите, что <filename>configure.in</filename> изменился.
Один из симптомов - появление таких вещей как @VARIABLE@ в вашем Makefile
после выполнения configure или <filename>config.status</filename>.)
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.build.configuring">
<question>
<para>
У меня возникают проблемы при конфигурировании PHP для работы с Apache.
Он говорит, что не может найти <filename>httpd.h</filename>,
хотя файл находится точно там, где я сказал!
</para>
</question>
<answer>
<para>
Для configure/setup скрипта вам необходимо указать
директорию верхнего уровня, в которой находятся исходники Apache.
Это означает, что вам надо задать <option role="configure">--with-apache=/path/to/apache</option>,
а <emphasis>не</emphasis>
<option role="configure">--with-apache=/path/to/apache/src</option>.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.build.lex">
<question>
<para>
Во время конфигурации PHP (<literal>./configure</literal>)
вы наталкиваетесь на ошибку, схожую со следующей:
</para>
<para>
<screen>
checking lex output file root... ./configure: lex: command not found
configure: error: cannot find output from lex; giving up
</screen>
</para>
</question>
<answer>
<para>
Не забудьте внимательно прочитать инструкции по
<link linkend="install.unix">установке</link> и заметьте, что для
компиляции PHP вам нужно установить как flex, так и bison.
В зависимости от ваших настроек, установите bison и flex либо из
исходников, либо из пакетов, например, RPM.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.build.apache-sharedcore">
<question>
<para>
Когда я пытаюсь запустить Apache, я получаю следующее сообщение:
</para>
<para>
<screen>
fatal: relocation error: file /path/to/libphp4.so:
symbol ap_block_alarms: referenced symbol not found
</screen>
</para>
</question>
<answer>
<para>
Эта ошибка обычно появляется, если ядро Apache было скомпилировано как
разделяемая библиотека DSO (Dynamic Shared Object). Попробуйте
переконфигурировать Apache, используя, по крайней мере, следующие флаги:
</para>
<para>
<screen>
--enable-shared=max --enable-rule=SHARED_CORE
</screen>
</para>
<para>
Для более подробной информации читайте файл <filename>INSTALL</filename>
в директории верхнего уровня или <link xlink:href="&url.apachedso;">
страницу руководства Apache по DSO</link>.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.build.not-found">
<question>
<para>
Когда я запускаю configure, он говорит, что не может найти файлы
include или библиотеку для GD, gdbm или какого-либо другого пакета!
</para>
</question>
<answer>
<para>
Вы можете сделать так, что скрипт configure будет искать файлы
заголовков или библиотеки в нестандартных местах, задав дополнительные
флаги для С препроцессора и компоновщика, такие как:
<programlisting>
<![CDATA[
CPPFLAGS=-I/path/to/include LDFLAGS=-L/path/to/library ./configure
]]>
</programlisting>
Если вы используете csh-подобную оболочку (зачем?), то это будет:
<programlisting>
<![CDATA[
env CPPFLAGS=-I/path/to/include LDFLAGS=-L/path/to/library ./configure
]]>
</programlisting>
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.build.yytname">
<question>
<para>
При компиляции файла <filename>language-parser.tab.c</filename>
мне выдаются ошибки, говорящие <literal>yytname undeclared</literal>.
</para>
</question>
<answer>
<para>
Вам необходимо обновить вашу версию Bison. Последнюю версию можно
найти на
<link xlink:href="&url.bison;">&url.bison;</link>.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.build.link">
<question>
<para>
Когда я запускаю <command>make</command>, похоже, он выполняется нормально,
но на конечной линковке жалуется, что не может найти некоторые файлы.
</para>
</question>
<answer>
<para>
Некоторые старые версии make ошибочно не помещают скомпилированные
файлы в поддиректорию functions в той же директории.
Попробуйте выполнить <command>cp *.o functions</command> и затем
перезапустить <command>make</command>. Если это помогло, то вам
действительно надо установить свежую версию GNU make.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.build.undefined">
<question>
<para>
При компоновке PHP, он жалуется на некоторые неопределённые ссылки.
</para>
</question>
<answer>
<para>
Посмотрите на строку для компоновки и убедитесь, что все нужные библиотеки
добавлены в конце. Часто забывают '-ldl' и библиотеки, необходимые для
поддержки включённых вручную баз данных.
</para>
<para>
Некоторые люди также сообщают, что при компоновке с Apache
им пришлось добавить '-ldl' сразу после <filename>libphp4.a</filename>.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.build.not-running">
<question>
<para>
Я следовал всем шагам по установке модульной версии для Apache на Unix,
но мои PHP-скрипты выводятся в браузере или я получаю запрос сохранить файл.
</para>
</question>
<answer>
<para>
Это означает, что по какой-то причине модуль PHP не вызывается.
Перед тем как обращаться за помощью, проверьте три вещи:
<itemizedlist>
<listitem>
<simpara>
Убедитесь, что запускаемый вами бинарник httpd действительно новый,
только что построенный httpd. Для этого попробуйте запустить:
<literal>/path/to/binary/httpd -l</literal>
</simpara>
<simpara>
Если вы не видите <filename>mod_php4.c</filename> в списке, то вы
запускаете не тот бинарник. Найдите и установите правильный бинарник.
</simpara>
</listitem>
<listitem>
<simpara>
Убедитесь, что вы добавили правильный Mime Type в один из ваших
<literal>Apache .conf</literal>
файлов. Это должно быть: <literal>AddType application/x-httpd-php .php</literal>
</simpara>
<simpara>
Также убедитесь, что эта строка AddType не попала внутрь
&lt;Virtualhost&gt; или &lt;Directory&gt; блока, так как это не
даст
ей работать с местонахождением вашего тестового скрипта.
</simpara>
</listitem>
<listitem>
<simpara>
Наконец, между Apache 1.2 и Apache 1.3 расположение конфигурационных
файлов Apache по умолчанию изменилось. Вам надо проверить, что
действительно читается тот конфигурационный файл, в который вы
добавили строку AddType. Вы можете внести очевидную синтаксическую
ошибку в ваш &httpd.conf; файл или какое-либо другое заметное
изменение, которое покажет вам, что читается правильный файл.
</simpara>
</listitem>
</itemizedlist>
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.build.activate-module">
<question>
<para>
В документации рекомендуется использовать:
<literal>--activate-module=src/modules/php4/libphp4.a</literal>,
но такой файл не существует, поэтому я заменил это на
<literal>--activate-module=src/modules/php4/libmodphp4.a</literal>
и оно не работает!? Что происходит?
</para>
</question>
<answer>
<para>
Заметьте, что файл <filename>libphp4.a</filename> не должен
существовать.
Он будет создан в процессе!
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.build.ansi">
<question>
<para>
Когда я пытаюсь собрать Apache c PHP в виде статического модуля,
используя <literal>--activate-module=src/modules/php4/libphp4.a</literal>
он говорит, что мой компилятор не ANSI-совместимый.
</para>
</question>
<answer>
<para>
Сообщение об ошибке вводит в заблуждение; это исправлено в более
свежих версиях Apache.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.build.apxs">
<question>
<para>
Когда я пытаюсь собрать PHP с помощью <option role="configure">--with-apxs</option>,
я получаю странное сообщение об ошибке.
</para>
</question>
<answer>
<para>
Проверьте три вещи. Во-первых, по какой-то причине, когда Apache
создаёт Perl скрипт apxs, он получается без правильного компилятора и
переменных, задающих флаги.
Найдите ваш apxs скрипт (попробуйте команду <command>which apxs</command>),
иногда он установлен как <filename>/usr/local/apache/bin/apxs</filename>
или <filename>/usr/sbin/apxs</filename>.
Откройте его и найдите строки, схожие с этими:
<programlisting>
<![CDATA[
my $CFG_CFLAGS_SHLIB = ' '; # substituted via Makefile.tmpl
my $CFG_LD_SHLIB = ' '; # substituted via Makefile.tmpl
my $CFG_LDFLAGS_SHLIB = ' '; # substituted via Makefile.tmpl
]]>
</programlisting>
Если они так и выглядят, то вы нашли вашу проблему. Они могут содержать
только пробелы или другие неправильные значения, такие как 'q()'.
Измените эти строки на:
<programlisting>
<![CDATA[
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
]]>
</programlisting>
Вторая возможная проблема возникает только на Red Hat 6.1 и 6.2.
Скрипт apxs, поставляемый с Red Hat, сломан. Ищите эту строку:
<programlisting>
<![CDATA[
my $CFG_LIBEXECDIR = 'modules'; # substituted via APACI install
]]>
</programlisting>
Если вы нашли вышеприведённую строку, измените её на следующее:
<programlisting>
<![CDATA[
my $CFG_LIBEXECDIR = '/usr/lib/apache'; # substituted via APACI install
]]>
</programlisting>
И последнее, если вы переконфигурируете/переустанавливаете Apache,
запустите <command>make clean</command> после <command>./configure</command>
и перед <command>make</command>.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.build.microtime">
<question>
<para>
Во время выполнения <command>make</command> я очень быстро получаю
ошибки и множество всяких <literal>RUSAGE_</literal>.
</para>
</question>
<answer>
<para>
При выполнении <command>make</command> во время установки,
если вы сталкиваетесь с проблемами, похожими на следующее:
<programlisting>
<![CDATA[
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
]]>
</programlisting>
</para>
<para>
Ваша система сломана. Вы должны исправить ваши файлы
<filename>/usr/include</filename>, установив пакет glibc-devel,
который соответствует вашей glibc. Это абсолютно не зависит от PHP.
Для доказательства попробуйте следующий простой тест:
<programlisting>
<![CDATA[
$ cat >test.c <<X
#include <sys/resource.h>
X
$ gcc -E test.c >/dev/null
]]>
</programlisting>
Если выдаются ошибки, то ваши include файлы испорчены.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.build.mysql.tempnam">
<question>
<para>
При компиляции PHP с MySQL, configure выполняется нормально,
но во время <literal>make</literal> я получаю ошибку типа следующей:
<emphasis>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'</emphasis>,
в чём дело?
</para>
</question>
<answer>
<para>
Во-первых, важно понимать, что это <literal>Warning</literal> (предупреждение),
а не фатальная ошибка. Так как это последнее, что выводится во время
<literal>make</literal>, оно может выглядеть как фатальная ошибка,
но это не так. Конечно, если ваш компилятор умирает на предупреждениях,
(Warnings), то тогда да. Также имейте ввиду, что поддержка MySQL
включена по умолчанию.
</para>
<note>
<para>
Начиная с PHP 4.3.2 вы также будете видеть следующий текст после
того как сборка (make) завершится:
</para>
<para>
<screen>
Build complete.
(It is safe to ignore warnings about tempnam and tmpnam).
(Сборка завершена, можно безопасно игнорировать
предупреждения о tempnam и tmpnam.)
</screen>
</para>
</note>
</answer>
</qandaentry>
<qandaentry xml:id="faq.build.upgrade">
<question>
<para>
Я хочу обновить мой PHP. Где я могу найти строку
<command>./configure</command>, которая была использована для моей
текущей PHP установки?
</para>
</question>
<answer>
<para>
Либо смотрите файл config.nice в дереве исходников вашей текущей PHP
установки, либо, если это недоступно, просто выполните скрипт:
<programlisting role="php">
<![CDATA[
<?php phpinfo(); ?>
]]>
</programlisting>
В начале вывода будет находиться строка <command>./configure</command>,
которая была использована для сборки текущего PHP.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.build.gdlibs">
<question>
<para>
При сборке PHP с библиотекой GD, либо выдаются странные ошибки
компиляции, либо ошибки сегментации (segfaults) при выполнении.
</para>
</question>
<answer>
<para>
Убедитесь, что ваша библиотека GD и PHP компонуются с одними и теми же
зависимыми библиотеками (например, libpng).
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.installation.needgnu">
<question>
<para>
При компиляции PHP я, кажется, получаю случайные ошибки, например она
зависает. Я использую Solaris, если это имеет значение.
</para>
</question>
<answer>
<para>
Использование не GNU утилит во время компиляции PHP может вызвать
проблемы.
Чтобы быть уверенным, что компиляция PHP будет работать,
используйте GNU утилиты. Например, в Solaris, использование
SunOS BSD-совместимой или Solaris версии <literal>sed</literal>
не будет работать, а GNU или Sun POSIX (xpg4) версии
<literal>sed</literal> будет.
Ссылки: <link xlink:href="&url.sed;">GNU sed</link>,
<link xlink:href="&url.flex;">GNU flex</link>, and
<link xlink:href="&url.bison;">GNU bison</link>.
</para>
</answer>
</qandaentry>
</qandaset>
</chapter><!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->