# Проблемы сборки

В этом разделе собраны наиболее общие ошибки, возникающие на этапе сборки.

1. Я получил последнюю версию PHP, используя анонимный доступ к Git, но в нём нет конфигурационного скрипта!
2. У меня возникают проблемы при конфигурировании PHP для работы с Apache. Он говорит, что не может найти httpd.h, хотя файл находится точно там, где я сказал!
3. Во время конфигурации PHP (./configure) вы наталкиваетесь на ошибку, схожую со следующей: checking lex output file root... ./configure: lex: command not found configure: error: cannot find output from lex; giving up
4. Когда я пытаюсь запустить Apache, я получаю следующее сообщение: fatal: relocation error: file /path/to/libphp4.so: symbol ap_block_alarms: referenced symbol not found
5. Когда я запускаю configure, он говорит, что не может найти файлы include или библиотеку для GD, gdbm или какого-либо другого пакета!
6. При компиляции файла language-parser.tab.c мне выдаются ошибки, говорящие yytname undeclared.
7. Когда я запускаю make, похоже, он выполняется нормально, но на конечной линковке жалуется, что не может найти некоторые файлы.
8. При компоновке PHP, он жалуется на некоторые неопределённые ссылки.
9. Я следовал всем шагам по установке модульной версии для Apache на Unix, но мои PHP-скрипты выводятся в браузере или я получаю запрос сохранить файл.
10. В документации рекомендуется использовать: --activate-module=src/modules/php4/libphp4.a, но такой файл не существует, поэтому я заменил это на --activate-module=src/modules/php4/libmodphp4.a и оно не работает!? Что происходит?
11. Когда я пытаюсь собрать Apache c PHP в виде статического модуля, используя --activate-module=src/modules/php4/libphp4.a он говорит, что мой компилятор не ANSI-совместимый.
12. Когда я пытаюсь собрать PHP с помощью --with-apxs, я получаю странное сообщение об ошибке.
13. Во время выполнения make я очень быстро получаю ошибки и множество всяких RUSAGE_.
14. При компиляции PHP с MySQL, configure выполняется нормально, но во время make я получаю ошибку типа следующей: 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', в чём дело?
15. Я хочу обновить мой PHP. Где я могу найти строку ./configure, которая была использована для моей текущей PHP установки?
16. При сборке PHP с библиотекой GD, либо выдаются странные ошибки компиляции, либо ошибки сегментации (segfaults) при выполнении.
17. При компиляции PHP я, кажется, получаю случайные ошибки, например она зависает. Я использую Solaris, если это имеет значение.

Я получил последнюю версию PHP, используя анонимный доступ к Git, но в нём нет конфигурационного скрипта!

  Вам нужен установленный пакет GNU autoconf для того, чтобы сгенерировать конфигурационный скрипт из configure.in. После получения исходников с Git сервера просто запустите ./buildconf в директории верхнего уровня. (Также, если вы запускаете configure без опции `--enable-maintainer-mode`, то конфигурационный скрипт не будет перестроен автоматически при изменении файла configure.in, поэтому вам необходимо делать это вручную, когда вы заметите, что configure.in изменился. Один из симптомов - появление таких вещей как @VARIABLE@ в вашем Makefile после выполнения configure или config.status.)

У меня возникают проблемы при конфигурировании PHP для работы с Apache. Он говорит, что не может найти httpd.h, хотя файл находится точно там, где я сказал!

  Для configure/setup скрипта вам необходимо указать директорию верхнего уровня, в которой находятся исходники Apache. Это означает, что вам надо задать --with-apache=/path/to/apache, а не --with-apache=/path/to/apache/src.

Во время конфигурации PHP (`./configure`) вы наталкиваетесь на ошибку, схожую со следующей:
checking lex output file root... ./configure: lex: command not found
configure: error: cannot find output from lex; giving up

  Не забудьте внимательно прочитать инструкции по установке и заметьте, что для компиляции PHP вам нужно установить как flex, так и bison. В зависимости от ваших настроек, установите bison и flex либо из исходников, либо из пакетов, например, RPM.

Когда я пытаюсь запустить Apache, я получаю следующее сообщение:
fatal: relocation error: file /path/to/libphp4.so:
symbol ap_block_alarms: referenced symbol not found

  Эта ошибка обычно появляется, если ядро Apache было скомпилировано как разделяемая библиотека DSO (Dynamic Shared Object). Попробуйте переконфигурировать Apache, используя, по крайней мере, следующие флаги:

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

  Для более подробной информации читайте файл INSTALL в директории верхнего уровня или » страницу руководства Apache по DSO.

Когда я запускаю configure, он говорит, что не может найти файлы include или библиотеку для GD, gdbm или какого-либо другого пакета!

  Вы можете сделать так, что скрипт 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

При компиляции файла language-parser.tab.c мне выдаются ошибки, говорящие `yytname undeclared`.

  Вам необходимо обновить вашу версию Bison. Последнюю версию можно найти на » http://www.gnu.org/software/bison/bison.html.

Когда я запускаю make, похоже, он выполняется нормально, но на конечной линковке жалуется, что не может найти некоторые файлы.

  Некоторые старые версии make ошибочно не помещают скомпилированные файлы в поддиректорию functions в той же директории. Попробуйте выполнить cp *.o functions и затем перезапустить make. Если это помогло, то вам действительно надо установить свежую версию GNU make.

При компоновке PHP, он жалуется на некоторые неопределённые ссылки.

  Посмотрите на строку для компоновки и убедитесь, что все нужные библиотеки добавлены в конце. Часто забывают '-ldl' и библиотеки, необходимые для поддержки включённых вручную баз данных.

  Некоторые люди также сообщают, что при компоновке с Apache им пришлось добавить '-ldl' сразу после libphp4.a.

Я следовал всем шагам по установке модульной версии для Apache на Unix, но мои PHP-скрипты выводятся в браузере или я получаю запрос сохранить файл.

  Это означает, что по какой-то причине модуль PHP не вызывается. Перед тем как обращаться за помощью, проверьте три вещи:

  - Убедитесь, что запускаемый вами бинарник httpd действительно новый, только что построенный httpd. Для этого попробуйте запустить: `/path/to/binary/httpd -l` Если вы не видите mod_php4.c в списке, то вы запускаете не тот бинарник. Найдите и установите правильный бинарник.
  - Убедитесь, что вы добавили правильный Mime Type в один из ваших `Apache .conf` файлов. Это должно быть: `AddType application/x-httpd-php .php` Также убедитесь, что эта строка AddType не попала внутрь <Virtualhost> или <Directory> блока, так как это не даст ей работать с местонахождением вашего тестового скрипта.
  - Наконец, между Apache 1.2 и Apache 1.3 расположение конфигурационных файлов Apache по умолчанию изменилось. Вам надо проверить, что действительно читается тот конфигурационный файл, в который вы добавили строку AddType. Вы можете внести очевидную синтаксическую ошибку в ваш httpd.conf файл или какое-либо другое заметное изменение, которое покажет вам, что читается правильный файл.

В документации рекомендуется использовать: `--activate-module=src/modules/php4/libphp4.a`, но такой файл не существует, поэтому я заменил это на `--activate-module=src/modules/php4/libmodphp4.a` и оно не работает!? Что происходит?

  Заметьте, что файл libphp4.a не должен существовать. Он будет создан в процессе!

Когда я пытаюсь собрать Apache c PHP в виде статического модуля, используя `--activate-module=src/modules/php4/libphp4.a` он говорит, что мой компилятор не ANSI-совместимый.

  Сообщение об ошибке вводит в заблуждение; это исправлено в более свежих версиях Apache.

Когда я пытаюсь собрать PHP с помощью --with-apxs, я получаю странное сообщение об ошибке.

  Проверьте три вещи. Во-первых, по какой-то причине, когда Apache создаёт Perl скрипт apxs, он получается без правильного компилятора и переменных, задающих флаги. Найдите ваш 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

  Вторая возможная проблема возникает только на 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, запустите make clean после ./configure и перед make.

Во время выполнения make я очень быстро получаю ошибки и множество всяких `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

  Ваша система сломана. Вы должны исправить ваши файлы /usr/include, установив пакет glibc-devel, который соответствует вашей glibc. Это абсолютно не зависит от PHP. Для доказательства попробуйте следующий простой тест:

      $ cat >test.c <<X
      #include <sys/resource.h>
      X
      $ gcc -E test.c >/dev/null

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

При компиляции PHP с MySQL, configure выполняется нормально, но во время `make` я получаю ошибку типа следующей: 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', в чём дело?

  Во-первых, важно понимать, что это `Warning` (предупреждение), а не фатальная ошибка. Так как это последнее, что выводится во время `make`, оно может выглядеть как фатальная ошибка, но это не так. Конечно, если ваш компилятор умирает на предупреждениях, (Warnings), то тогда да. Также имейте ввиду, что поддержка MySQL включена по умолчанию.

  > Замечание:

  > Начиная с PHP 4.3.2 вы также будете видеть следующий текст после того как сборка (make) завершится:

  > Build complete.
  > (It is safe to ignore warnings about tempnam and tmpnam).
  > (Сборка завершена, можно безопасно игнорировать
  > предупреждения о tempnam и tmpnam.)

Я хочу обновить мой PHP. Где я могу найти строку ./configure, которая была использована для моей текущей PHP установки?

  Либо смотрите файл config.nice в дереве исходников вашей текущей PHP установки, либо, если это недоступно, просто выполните скрипт:

      <?php phpinfo(); ?>

  В начале вывода будет находиться строка ./configure, которая была использована для сборки текущего PHP.

При сборке PHP с библиотекой GD, либо выдаются странные ошибки компиляции, либо ошибки сегментации (segfaults) при выполнении.

  Убедитесь, что ваша библиотека GD и PHP компонуются с одними и теми же зависимыми библиотеками (например, libpng).

При компиляции PHP я, кажется, получаю случайные ошибки, например она зависает. Я использую Solaris, если это имеет значение.

  Использование не GNU утилит во время компиляции PHP может вызвать проблемы. Чтобы быть уверенным, что компиляция PHP будет работать, используйте GNU утилиты. Например, в Solaris, использование SunOS BSD-совместимой или Solaris версии `sed` не будет работать, а GNU или Sun POSIX (xpg4) версии `sed` будет. Ссылки: » GNU sed, » GNU flex, and » GNU bison.

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open