Kapitel 50. Probleme bei der Compilierung

Diese Sektion behandelt die meistverbreiteten Fehler, die beim Compilieren von PHP auftauchen.

1. Ich habe mir die aktuellste Version von PHP mit Hilfe des Anonymous-CVS-Dienstes besorgt, kann aber kein configure-Script finden.
2. Ich habe Probleme. PHP für den Apache zu konfigurieren. Er beschwert sich, das er die Datei httpd.h nicht finden kann, obwohl sie sich genau dort befindet, wo ich es angegeben habe.
3. When I run configure, it says that it can't find the include files or library for GD, gdbm, or some other package!
4. Wenn die Datei language-parser.tab.c compiliert wird, erscheinen Fehler, die yytname undeclared besagen.
5. Wenn ich make ausführe, scheint alles normal zu verlaufen, aber sobald es versucht, die Applikation zu linken, beschwert es sich, einige Dateien nicht finden zu können.
6. Wenn PHP gelinkt wird, berschwert es sich über undefinierte Referenzen.
7. Wie wird PHP mit Apache 1.3.x compiliert?
8. Ich habe die Schritte, die zur Installation des Apache-Modules unter UNIX nötig sind, aber wenn ich mit meinem Browser PHP-Scripts aufrufe, werde ich aufgefordert, die Dateien zu speichern.
9. Es heisst, es muß --activate-module=src/modules/php4/libphp4.a benutzt werden, aber diese Datei existiert nicht, also habe ich es zu --activate-module=src/modules/php4/libmodphp4.a geändert, aber es funktioniert nicht.
10. Wenn ich versuche, den Apache mit PHP als statisches Modul mittels --activate-module=src/modules/php4/libphp4.a zu compilieren, kommt die Fehlermeldung, mein Compiler sei nicht ANSI-Konform.
11. Wenn ich versuche, PHP mittels der Option --with-apxs zu compilieren, bekomme ich komische Fehlermeldungen.
12. Während des make bekomme ich Fehler in microtime und jede Menge RUSAGE_-Zeugs.
13. Ich möchte mein PHP aktualisieren. Wo kann ich die ./configure-Zeile finden, die von meiner aktuellen PHP-Version verwendet wird?
14. Wenn ich PHP mit der GD-Library compiliere, tauchen seltsame Compilerfehler auf oder PHP startet nicht.

1. Ich habe mir die aktuellste Version von PHP mit Hilfe des Anonymous-CVS-Dienstes besorgt, kann aber kein configure-Script finden.

Sie müssen das GNU autoconf-Paket installiert haben, damit das configure-Script aus configure.in generiert werden kann. Mittels ./buildconf im Hauptverzeichnis des vom CVS-Server gezogenen Source-Trees wird das configure-Script generiert. Es ist zu beachten, das das configure-Script bei einer geänderten configure.in nicht neu generiert wird, es sei denn, configure wird mit dem Parameter --enable-maintainer-mode aufgerufen. Es sollte also darauf geachtet werden, das das configure-Script manuell neu generiert wird, wenn configure.in verändert wurde. Ein Symptom für eine Veränderung des configure.in ist, wenn Dinge wie @VARIABLE@ im Makefile auftachen, nachem configure oder config.status ausgeführt wurde.

2. Ich habe Probleme. PHP für den Apache zu konfigurieren. Er beschwert sich, das er die Datei httpd.h nicht finden kann, obwohl sie sich genau dort befindet, wo ich es angegeben habe.

Sie müssen dem configure/setip-Script die Top-Level-Pfad des Apache-Source-Trees mitteilen. Das bedeutet, daß z.B. --with-apache=/path/to/apache korrekt ist, --with-apache=/path/to/apache/src jedoch nicht.

3. When I run configure, it says that it can't find the include files or library for GD, gdbm, or some other package!

Es ist möglich, das configure-Script so anzupassen, das es nicht nur in Standard-Pfaden nach Headerdatei und Bibliotheken sucht, in dem dem C Präprozessort und Linker zusätzliche Flags übergeben werden:
CPPFLAGS=-I/path/to/include LDFLAGS=-L/path/to/library ./configure
Wenn Sie (aus welchem Grund auch immer) eine csh-Variante als Login-Shell verwenden:
env CPPFLAGS=-I/path/to/include LDFLAGS=-L/path/to/library ./configure

4. Wenn die Datei language-parser.tab.c compiliert wird, erscheinen Fehler, die yytname undeclared besagen.

Sie müssen Bison updaten. Die aktuellste Version findet sich unter ftp://ftp.gnu.org/pub/gnu/bison/.

5. Wenn ich make ausführe, scheint alles normal zu verlaufen, aber sobald es versucht, die Applikation zu linken, beschwert es sich, einige Dateien nicht finden zu können.

Einige alte Versionen von make platzieren die compilierten Versionen der Dateien nicht in das korrekte Verzeichnis. Versuchen Sie, das Problem zu lösen, indem sie zunächst mittels cp *.o functions die Dateien an der vorgesehenen Platz kopieren, und anschließend make noch einmal ausführen. Sollte es dann funktionieren, empfehlen wir, Ihre Version von GNU make zu aktualisieren.

6. Wenn PHP gelinkt wird, berschwert es sich über undefinierte Referenzen.

Schauen Sie sich die Link-Zeile an, und stellen Sie sicher, das alle nötigen Bibliotheken am Ende mit eingeschlossen werden. Häufig werden '-ldl' und Datenbankbibliothken vergessen.

Wenn Sie mit Apache 1.2.x linken, haben Sie daran gedacht, die benötigten Informationen in die EXTRA_LIBS-Zeile des Konfigurationsscriptes einzufügen, und haben Sie das configure-Script des Apache wiederholt ausgeführt? Weitere Informationen dazu finden Sie im INSTALL File Ihrer Distribution.

Einige Leute haben berichtet, daß sie '-ldl' unmittelbar nach libphp4.a einfügen mußten, wenn sie PHP mit Apache gelinkt haben.

7. Wie wird PHP mit Apache 1.3.x compiliert?

Folgen Sie diesen Schritten:

  • Besorgen Sie sich die letzte Version von Apache unter http://www.apache.org/dist/.

  • Entpacken Sie die Datei zum Beispiel unter /usr/local/src/apache-1.3.

  • Compilieren Sie zunächst PHP, zum Beispiel mit ./configure --with-apache=/<path>/apache-1.3 (ersetzen Sie <path> mit dem Pfad zu Ihrem apache-1.3-Verzeichnis.

  • Führen Sie make, gefolgt von einem make install aus, und kopieren die benötigten Dateien in den Apache-Tree.

  • Wechseln Sie in das Verzeichnis /<path>/apache-1.3/src und bearbeiten die Datei Configuration. Fügen Sie AddModule modules/php4/libphp4.a hinzu.

  • Führen Sie ./Configure, gefolgt von make aus.

  • Nun sollte eine lauffähig Version eines PHP-fähigen Apaches compiliert sein.

Bitte beachten Sie: Sie können auch das neue Apache ./configure-Script nuten. Weitere Informationen dazu finden sie in der Datei README.configure, die der Apache-Distribution beiliegt. Auch in der Datei INSTALL Ihrer PHP-Distribution finden sich Informationen dazu.

8. Ich habe die Schritte, die zur Installation des Apache-Modules unter UNIX nötig sind, aber wenn ich mit meinem Browser PHP-Scripts aufrufe, werde ich aufgefordert, die Dateien zu speichern.

Das bedeutet das das PHP-Modul nicht aufgerufen wird. Sie sollten folgende Dinge überprüfen:

  • Stellen Sie sicher, das das httpd-Binary, das sie ausführen das neue httpd-Binary ist, das sie compiliert haben. Um das zu tun versuchen Sie, /path/to/binary/httpd -l auszuführen.

    Wenn mod_php4.c nicht auftaucht, führen Sie nicht das korrekte Binary aus. Finden und installieren Sie das korrekte Binary.

  • Stellen Sie sicher, das die den korrekten Mime-Type in ihrer Apache .conf-Datei angegeben haben. Er sollte AddType application/x-httpd-php3 .php3 (für PHP 3)

    oder AddType application/x-httpd-php .php (für PHP 4) lauten.

    Stellen Sie ebenfalls sicher, das diese AddType-Anweisung sich nicht in einem <Virtualhost> oderr <Directory> Block befindet.

  • Der Standardplatz der Apache Konfigurationsdateien hat sich von Apache 1.2 zu Apache 1.3 verändert. Sie sollten sicherstellen, das die Konfigurationsdatei, zu der sie die AddType-Anweisung hinzugefügt haben diejenige ist, die auch verarbeitet wird. Sie können einen offensichtlichen Syntaxfehler oder eine andere eindeutige Änderung in Ihre httpd.conf einfbauen, um dies zu überprüfen.

9. Es heisst, es muß --activate-module=src/modules/php4/libphp4.a benutzt werden, aber diese Datei existiert nicht, also habe ich es zu --activate-module=src/modules/php4/libmodphp4.a geändert, aber es funktioniert nicht.

Die Datei libphp4.a soll nicht existieren, der Apache wird es generieren.

10. Wenn ich versuche, den Apache mit PHP als statisches Modul mittels --activate-module=src/modules/php4/libphp4.a zu compilieren, kommt die Fehlermeldung, mein Compiler sei nicht ANSI-Konform.

Das ist eine irreführende Fehlermeldung des Apache, die in aktuellen Versionen behoben ist.

11. Wenn ich versuche, PHP mittels der Option --with-apxs zu compilieren, bekomme ich komische Fehlermeldungen.

Hier sind drei Dinge zu überprüfen: Wenn Apache das apxs Perlscript generiert, werden manchmal aus unerfindlichen Gründen nicht die richtigen Compiler-Flags verwendet. Öffnen Sie Ihr apxs-Script und überprüfen es auf Zeilen, die ähnlich wie folgende aussehen:
my $CFG_CFLAGS_SHLIB  = ' ';          # substituted via Makefile.tmpl
my $CFG_LD_SHLIB      = ' ';          # substituted via Makefile.tmpl
my $CFG_LDFLAGS_SHLIB = ' ';          # substituted via Makefile.tmpl
Wenn Sie so etwas sehen, haben Sie Ihr Problem gefunden. Ändern Sie die Zeilen wie folgt:
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
Das zweite mögliche Problem kann unter Red Hat 6.1 und 6.2 auftauchen. Das apxs-Script, das Red Hat ausliefert ist fehlerhaft. Suchen sie nach dieser Zeile:
my $CFG_LIBEXECDIR    = 'modules';         # substituted via APACI install
Ändern Sie diese Zeile in
my $CFG_LIBEXECDIR    = '/usr/lib/apache'; # substituted via APACI install
Zuguterletzt, wenn sie Apache neu installieren, fügen Sie ein make clean nach dem ./configure und vor dem make ein.

12. Während des make bekomme ich Fehler in microtime und jede Menge RUSAGE_-Zeugs.

Wenn während des make-Teils der Installation Probleme auftauchen, die wie folgt aussehen:
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

ist Ihr System beschädigt. Sie müssen Ihr /usr/include reparieren, indem sie das glibc-devel-Paket installieren, dessen Version mit der Ihrer glibc übereinstimmt. Das hat absolut nichts mit PHP zu tun. Um sich selbst davon zu überzeugen, führen Sie folgenden simplen Test durch:
$ cat >test.c <<X
#include <sys/resource.h>
X
$ gcc -E test.c >/dev/null
Wenn hier Fehler auftachen wissen sie, das ihre include-Dateien fehlen oder fehlerhaft sind.

13. Ich möchte mein PHP aktualisieren. Wo kann ich die ./configure-Zeile finden, die von meiner aktuellen PHP-Version verwendet wird?

Entweder schauen sie in die config.nice-Datei im Source-Tree ihrer aktuellen PHP-Version nach, oder Sie führen folgendes Script aus:
<?php phpinfo(); ?>
Zu Beginn der Datei wird die ./configure-Zeile angezeigt.

14. Wenn ich PHP mit der GD-Library compiliere, tauchen seltsame Compilerfehler auf oder PHP startet nicht.

Stellen Sie sicher, dass PHP und die GD-Library gegen die selben Bibliotheken wie libPNG gelinkt sind.