У цьому розділі зібрано найпоширеніші помилки, які виникають під час збирання PHP.
У вас має бути встановленим пакунок GNU autoconf, за допомогою якого
зможете генерувати скрипт конфігурації з
configure.in. Достатньо виконати
./buildconf в початковій теці після отримання
початкового коду з сервера Git. (Крім того, допоки ви не запустите
configure з параметром
--enable-maintainer-mode
, скрипт конфігурації не буде
автоматично перебудовано, коли файл configure.in
оновиться, і вам доведеться робити це вручну, коли
configure.in зміниться. Ознакою того є слова
@VARIABLE@ у вашому Makefile після запуску конфігурації чи
config.status.)
Ви повинні назвати скрипту конфігурації розташування початкової теки початкових кодів Apache. Це означає, що треба вказати --with-apache=/path/to/apache, а не --with-apache=/path/to/apache/src.
./configure
), ви натрапили на
помилку, подібну до наступної:
Уважно перечитайте інструкції зі встановлення та майте на увазі, що вам потрібні встановлені пакунки flex і bison, щоб скомпілювати PHP. Залежно від ваших налаштувань, bison і flex встановлюються або з джерела, або з пакета, наприклад RPM.
Ви можете зробити так, щоб скрипт конфігурації шукав файли-заголовки та бібліотеки в нестандартних місцях, задавши додаткові прапорці для препроцесора C і компонувальника, наприклад:
CPPFLAGS=-I/path/to/include LDFLAGS=-L/path/to/library ./configure
env CPPFLAGS=-I/path/to/include LDFLAGS=-L/path/to/library ./configure
yytname undeclared
.
Вам треба оновити пакунок Bison. Найновіша версія за адресою » http://www.gnu.org/software/bison/bison.html.
Деякі старі версії make не можуть правильно помістити скомпільовані файли у теки. Спробуйте запустити cp *.o functions, потім перезапустити make, щоб побачити, чи це допоможе. Якщо так, то вам конче треба отримати найновішу версію GNU make.
Подивіться на рядок з посиланнями, та упевніться, що усі необхідні бібліотеки були включені. Здебільшого це "-ldl" та бібліотеки, потрібні для включених баз даних.
Дехто каже, що треба дописати '-ldl' відразу після libphp4.a, коли компонуєте модуль для Apache.
Це означає, що PHP-модуль чомусь не викликається. Перед проханням про додаткову допомогу треба перевірити три речі:
/path/to/binary/httpd -l
Якщо ви не бачите у списку mod_php4.c, отже
запущено не той двійковий файл. Знайдіть і встановіть потрібний.
.conf
файлів Apache. Наприклад:
AddType application/x-httpd-php .php
Також перевірте, чи інструкція AddType не знаходиться за межами
блоку <Virtualhost> або <Directory>, бо це не дозволить
застосувати її до вашого тестового скрипта.
--activate-module=src/modules/php4/libphp4.a
, але
такого файлу немає, тож я замінив параметр на
--activate-module=src/modules/php4/libmodphp4.a
, та це
не спрацювало! Що відбувається?
Зауважте, що файлу libphp4.a і не має існувати. Процес Apache створить його!
--activate-module=src/modules/php4/libphp4.a
, воно
каже, що мій компілятор не сумісний з ANSI.
Це хибне повідомлення про помилку від Apache, яке буде виправлене в майбутніх версіях.
Треба перевірити три речі. По-перше, інколи 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
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
my $CFG_LIBEXECDIR = 'modules'; # substituted via APACI install
my $CFG_LIBEXECDIR = '/usr/lib/apache'; # substituted via APACI install
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
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).
У файлі config.nice, або у дереві початкових кодів встановленого PHP, якщо це недоступно, можете просто запустити скрипт
<?php phpinfo(); ?>
Упевніться, що ваша бібліотека GD та PHP залежні від однакових бібліотек (напр. libpng).
Використання не-GNU утиліт для компіляції PHP може спричинити проблеми.
Використовуйте інструменти GNU для впевненості у належній компіляції PHP.
Наприклад, у Solaris, використання BSD-сумісних версій
sed
від SunOS або Solaris не спрацює, натомість версії
sed
від GNU або Sun POSIX (xpg4) будуть працювати.
Посилання: » GNU sed,
» GNU flex та
» GNU bison.