
Ich versuche, PhantomJS v1.6 auf meinem Centos 5.8-Server zu installieren. Beim Versuch, PhantomJS auszuführen, tritt der folgende Fehler auf:
phantomjs: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.11' not found (required by phantomjs)
phantomjs: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.9' not found (required by phantomjs)
phantomjs: /usr/phantomjs-1.6.0-linux-x86_64-dynamic/bin/../lib/libc.so.6: version `GLIBC_2.7' not found (required by phantomjs)
phantomjs: /usr/phantomjs-1.6.0-linux-x86_64-dynamic/bin/../lib/libc.so.6: version `GLIBC_2.7' not found (required by /usr/phantomjs-1.6.0-linux-x86_64-dynamic/bin/../lib/libQtGui.so.4)
phantomjs: /usr/phantomjs-1.6.0-linux-x86_64-dynamic/bin/../lib/libc.so.6: version `GLIBC_2.11' not found (required by /usr/phantomjs-1.6.0-linux-x86_64-dynamic/bin/../lib/libQtGui.so.4)
phantomjs: /usr/phantomjs-1.6.0-linux-x86_64-dynamic/bin/../lib/libc.so.6: version `GLIBC_2.9' not found (required by /usr/phantomjs-1.6.0-linux-x86_64-dynamic/bin/../lib/libQtGui.so.4)
phantomjs: /usr/phantomjs-1.6.0-linux-x86_64-dynamic/bin/../lib/libc.so.6: version `GLIBC_2.10' not found (required by /usr/phantomjs-1.6.0-linux-x86_64-dynamic/bin/../lib/libQtNetwork.so.4)
phantomjs: /usr/phantomjs-1.6.0-linux-x86_64-dynamic/bin/../lib/libc.so.6: version `GLIBC_2.9' not found (required by /usr/phantomjs-1.6.0-linux-x86_64-dynamic/bin/../lib/libQtCore.so.4)
phantomjs: /usr/phantomjs-1.6.0-linux-x86_64-dynamic/bin/../lib/libc.so.6: version `GLIBC_2.11' not found (required by /usr/phantomjs-1.6.0-linux-x86_64-dynamic/bin/../lib/libfreetype.so.6)
phantomjs: /usr/phantomjs-1.6.0-linux-x86_64-dynamic/bin/../lib/libc.so.6: version `GLIBC_2.7' not found (required by /usr/phantomjs-1.6.0-linux-x86_64-dynamic/bin/../lib/libfontconfig.so.1)
Nach einigen Recherchen bin ich zu dem Schluss gekommen, dass es sich hier um ziemlich einfache Systemdateien handelt, mit denen ich nicht unbedingt etwas anfangen sollte. Irgendwelche Ideen, wie ich das auf meinem Server zum Laufen bekomme?
Antwort1
Es sucht nach versionierten Symbolen in glibc und libstdc++. Die Versionen in den Bibliotheken auf Ihrem System sind älter und stimmen daher nicht überein. Das ist logisch, da CentOS RedHat AdvancedServer verfolgt, das bei neuer Software ziemlich konservativ ist.
Sie können die Symbole in Ihrer libstdc++ folgendermaßen überprüfen:
nm -D /usr/lib64/libstdc++.so.6 | grep GLIBC
nm
gibt benannte Symbole aus, -D für dynamische Bibliotheken und grep für Ihre Namen
Hmm, das sind ziemlich grundlegende Bibliotheken. libstdc++ wird von jeder App verwendet, die C++ auf Ihrem Betriebssystem verwendet. glibc wird von so ziemlich allem verwendet. Sie möchten diese wahrscheinlich nicht direkt aktualisieren, und selbst wenn Sie es täten, würden Sie Ihre Aktualisierungen wahrscheinlich beim nächsten Systemupdate verlieren.
Ich hatte ein ähnliches Problem mit Firefox. So können Sie es lösen:
- Suchen Sie ein Fedora RPM-Repository.Diese Seite scheint nützlich.
- Wählen Sie eine Version. Machen Sie sich keine Gedanken über die richtige Version. Wenn es nicht funktioniert, versuchen wir es erneut.
- Suchen Sie die libc- und libstdc++ x86_64-RPMs für die von Ihnen ausgewählte Version. Laden Sie sie herunter.
- Gehen Sie in ein temporäres Verzeichnis und entpacken Sie es:
rpm2cpio libstdc++WHATEVER.rpm | cpio -iv --make-directories
- Erstellen Sie ein weiteres Verzeichnis. Dieses muss noch eine Weile erhalten bleiben. Suchen Sie einen Platz in /usr/local oder Ihrem Home-Verzeichnis. Ich würde vielleicht $HOME/lib/lib64 sagen, nur um ihm einen Namen zu geben. Ersetzen Sie den Namen nach Bedarf.
mkdir $HOME/lib/lib64
- Suchen Sie die Datei libstdc++.so.6 und kopieren Sie sie nach $HOME/lib/lib64.
Jetzt haben Sie die benötigte Bibliothek in $HOME/lib/lib64 (oder wo auch immer Sie sie abgelegt haben). Wenn Sie Ihre App jetzt ausführen, müssen Sie ihr mitteilen, wie sie nach der neuen Bibliothek suchen soll.
LD_LIBRARY_PATH=$HOME/lib/lib64:$LD_LIBRARY_PATH appThatNeedsNewLib arg1 arg2
Stellen Sie sich darauf ein, dies mehrere Male durchzuführen. Als ich dies tat, wurden durch das Abrufen der richtigen libstdc++-Version andere alte Dateien sichtbar, für die ich ebenfalls Updates herunterladen musste.
Antwort2
Gilt für: PhantomJS 1.6. Und getestet auf Centos 5.6
Sie können es aus dem Quellcode kompilieren und es wird problemlos funktionieren.
./build.sh
Führen Sie nach dem Erstellen die Bereitstellung durch, die Sie überall ausführen können. Kopieren und ersetzen Sie einfach die Dateien, bei denen dieser Fehler auftritt.
Ich hatte dasselbe Problem, ich habe es aus der Quelle kompiliert und die erforderliche Datei kopiert. (Ich gehe davon aus, dass ich es so gemacht habe: auf dem Diff-Server kompiliert und die Dateien hinüberkopiert, aber das können Sie auch immer auf dem gleichen Server tun.)
In usr/local/src heruntergeladen und kompiliert. Erforderliche Datei an den ursprünglichen Speicherort kopiert
cp -rP /usr/local/src/phantomjs-1.6.0-linux-x86_64-dynamic/bin/phantomjs* /data/phantomjs/bin/
cp -rP /usr/local/src/phantomjs-1.6.0-linux-x86_64-dynamic/lib/l* /data/phantomjs/lib/
Warnung: Das Kompilieren von PhantomJS aus dem Quellcode dauert lange, hauptsächlich aufgrund der Tausenden von Dateien im WebKit-Modul. Bei 4 parallelen Kompiliervorgängen auf einem modernen Rechner dauert der gesamte Vorgang etwa 30 Minuten. Es wird dringend empfohlen, das vorgefertigte Binärpaket zu installieren, sofern es verfügbar ist. Linux
Hinweis 1: build.sh startet standardmäßig 4 (vier) parallele Kompilierjobs. Wenn Sie auf einer virtuellen Maschine/einem virtuellen Server oder einer anderen eingeschränkten Umgebung bauen, reduzieren Sie die Jobs, indem Sie eine Nummer übergeben, z. B. ./build.sh --jobs 1, um jeweils nur einen Kompilierjob festzulegen.