Проблеми збірки

У цьому розділі зібрано найпоширеніші помилки, які виникають під час збирання PHP.

  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. Коли я запускаю скрипт конфігурації, він каже, що не може включити файли або бібліотеку GD, gdbm, чи якогось іншого пакунка.
  6. Коли компілюється файл language-parser.tab.c, то виводяться помилки yytname undeclared.
  7. Коли я запускаю make, наче все йде добре, але завершується невдачею під час компонування програми, скаржачись, що не може знайти якісь файли.
  8. Коли компоную PHP, воно скаржиться на кількість невизначених посилань.
  9. Я послідовно виконав усі кроки встановлення PHP, як модуля Apache у Unix, а мої скрипти показуються в браузері, як простий текст, або браузер пропонує мені зберегти файл.
  10. Там сказано використати --activate-module=src/modules/php4/libphp4.a, але такого файлу немає, тож я замінив параметр на --activate-module=src/modules/php4/libmodphp4.a, та це не спрацювало! Що відбувається?
  11. Коли я намагаюсь зібрати Apache із 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, яка була виконана для збирання поточної встановленої версії?
  16. Під час збирання PHP з підтримкою GD виводяться дивні помилки компіляції або під час виконання — помилки сегментації.
  17. Під час компіляції PHP я, здається, отримую випадкові помилки, наче вона зависає. Я використовую Solaris, якщо це важливо.
Я отримав останню версію PHP, використавши анонімний сервіс Git, але в ній немає скрипту конфігурації!

У вас має бути встановленим пакунок GNU autoconf, за допомогою якого зможете генерувати скрипт конфігурації з configure.in. Достатньо виконати ./buildconf в початковій теці після отримання початкового коду з сервера Git. (Крім того, допоки ви не запустите configure з параметром --enable-maintainer-mode, скрипт конфігурації не буде автоматично перебудовано, коли файл configure.in оновиться, і вам доведеться робити це вручну, коли configure.in зміниться. Ознакою того є слова @VARIABLE@ у вашому Makefile після запуску конфігурації чи config.status.)

Я маю проблеми з налаштуванням PHP для роботи з Apache. Каже, що не може знайти httpd.h, проте він точно там, де я вказав!

Ви повинні назвати скрипту конфігурації розташування початкової теки початкових кодів 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

Уважно перечитайте інструкції зі встановлення та майте на увазі, що вам потрібні встановлені пакунки flex і bison, щоб скомпілювати PHP. Залежно від ваших налаштувань, bison і flex встановлюються або з джерела, або з пакета, наприклад RPM.

Коли я намагаюся запустити Apache, отримую таке повідомлення:

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

Зазвичай ця помилка з'являється, коли Apache було скомпільовано, як DSO для спільного використання. Спробуйте переконфігурувати Apache, упевнившись, що ви використали принаймні наступні прапорці:


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

Більше інформації вгорі файлу Apache'а INSTALL або на » Сторінці посібника з DSO від Apache.

Коли я запускаю скрипт конфігурації, він каже, що не може включити файли або бібліотеку GD, gdbm, чи якогось іншого пакунка.

Ви можете зробити так, щоб скрипт конфігурації шукав файли-заголовки та бібліотеки в нестандартних місцях, задавши додаткові прапорці для препроцесора C і компонувальника, наприклад:

    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.

Коли компоную PHP, воно скаржиться на кількість невизначених посилань.

Подивіться на рядок з посиланнями, та упевніться, що усі необхідні бібліотеки були включені. Здебільшого це "-ldl" та бібліотеки, потрібні для включених баз даних.

Дехто каже, що треба дописати '-ldl' відразу після libphp4.a, коли компонуєте модуль для Apache.

Я послідовно виконав усі кроки встановлення PHP, як модуля Apache у Unix, а мої скрипти показуються в браузері, як простий текст, або браузер пропонує мені зберегти файл.

Це означає, що PHP-модуль чомусь не викликається. Перед проханням про додаткову допомогу треба перевірити три речі:

  • Упевніться, що запущений вами двійковий httpd — той, що ви перед цим зібрали. Для цього виконайте: /path/to/binary/httpd -l Якщо ви не бачите у списку mod_php4.c, отже запущено не той двійковий файл. Знайдіть і встановіть потрібний.
  • Упевніться, що ви додали правильний MIME тип у одному з ваших .conf файлів Apache. Наприклад: AddType application/x-httpd-php .php Також перевірте, чи інструкція AddType не знаходиться за межами блоку <Virtualhost> або <Directory>, бо це не дозволить застосувати її до вашого тестового скрипта.
  • В решті решт, стандартне розташування файлів конфігурації Apache у версій 1.2 і 1.3 — відрізняється. Перевірте, що файли конфігурації, в які ви записали AddType, будуть прочитані. Можна навмисно внести помилку у ваш файл httpd.conf або будь-яку іншу очевидну зміну, яка сигналізуватиме, що файл прочитано коректно.

Там сказано використати --activate-module=src/modules/php4/libphp4.a, але такого файлу немає, тож я замінив параметр на --activate-module=src/modules/php4/libmodphp4.a, та це не спрацювало! Що відбувається?

Зауважте, що файлу libphp4.a і не має існувати. Процес Apache створить його!

Коли я намагаюсь зібрати Apache із 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', що не так?

Найперше, важливо усвідомити, що це попередження, а не фатальна помилка. Через те, що здебільшого це кінцевий вивід команди make, може здатися, що це фатальна помилка, але ні. Звісно, якщо ви налаштували свій компілятор "вмирати" від попереджень, то це буде нею. Ще майте на увазі, що стандартно підтримка MySQL ввімкнена.

Зауваження:

Починаючи з PHP 4.3.2, після завершення збірки (make) ви також бачитимете наступний текст:


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

Я хочу оновити мій PHP. Де я можу дізнатися повну команду ./configure, яка була виконана для збирання поточної встановленої версії?

У файлі config.nice, або у дереві початкових кодів встановленого PHP, якщо це недоступно, можете просто запустити скрипт

<?php phpinfo(); ?>
. Вгорі результату буде показано командний рядок ./configure, який було використано для збирання даної версії PHP.

Під час збирання PHP з підтримкою GD виводяться дивні помилки компіляції або під час виконання — помилки сегментації.

Упевніться, що ваша бібліотека GD та PHP залежні від однакових бібліотек (напр. libpng).

Під час компіляції PHP я, здається, отримую випадкові помилки, наче вона зависає. Я використовую Solaris, якщо це важливо.

Використання не-GNU утиліт для компіляції PHP може спричинити проблеми. Використовуйте інструменти GNU для впевненості у належній компіляції PHP. Наприклад, у Solaris, використання BSD-сумісних версій sed від SunOS або Solaris не спрацює, натомість версії sed від GNU або Sun POSIX (xpg4) будуть працювати. Посилання: » GNU sed, » GNU flex та » GNU bison.

add a note

User Contributed Notes

There are no user contributed notes for this page.
To Top