Archiv verlassen und diese Seite im Standarddesign anzeigen : libstdc++.so.X im Anwendungsverzeichnis
Hallo!
Ich habe auf derzeit einem Server lediglich Zugriff auf (m)ein Verzeichnis. Nun würde ich aber gerne C++ Web Applikationen nutzen doch beim Ausführen erhalte ich die Meldung: "...libstdc++.so.6 cannot load shared library" oder so ähnlich. Also kann er die Bibliotheken nicht finden.
Ich habe die libstdc++.so.6 schon einmal auf den Server (in das Verzeichnis) geladen aber er die Anwendung konnte dann auch nicht gestartet werden.
Ist es denn möglich die libstdc++.so.6 ins Verzeichnis der C++ Anwendung auf dem Server zu laden um die Anwendung auszuführen?
Gruß Claas
Welche Version der libstdc++ verwendet denn das System standardäßig? libstdc++.so.5?
Prinzipiell ist es kein Problem, mehrere Versionen einer Bibliothek zu installieren. Damit sie aber auch gefunden wird, muss sie in einem der folgenden Verzeichnisse installiert sein:
- in einem der Standardverzeichnisse /lib oder /usr/lib
- in einem der Verzeichnisse, die in der Konfigurationsdatei /etc/ld.so.conf stehen, in der Regel sind das mindestens /usr/local/lib und /usr/X11R6/lib
- in einem der Verzeichnisse, die in der Umgebungsvariable LD_LIBRARY_PATH stehen - diese Umgebungsvariable ist in der Regel standardmäßig nicht gesetzt oder leer
Bitte beachten: Auf Nicht-Windows-Systemen ist das Verzeichnis, in dem die ausführbare Datei liegt, im Gegensatz zu Windows nicht im Suchpfad für Bibliotheken enthalten. Will man es trotzdem so haben, muss man die Umgebungsvariable LD_LIBRARY_PATH selbst entsprechend setzen.
Wäre es mein System, würde ich die Bibliothek nach /usr/local/lib installieren. Dort ist sie sauber vom eigentlichen System getrennt und kann trotzdem von mehreren Anwendungen gleichzeitig benutzt werden.
Welche Version der libstdc++ verwendet denn das System standardäßig? libstdc++.so.5?
Von Haus aus keine C++ Bibliothek. Lediglich C Anwendungen laufen. Wenn ich aber die C++ Libs mit "g++ -static" linke kann ich sie auf dem Server ausführen. Allerdgins wollte ich das nicht. Benötigt wie die 6er (libstdc++.so.6)
- in einem der Standardverzeichnisse /lib oder /usr/lib
- in einem der Verzeichnisse, die in der Konfigurationsdatei /etc/ld.so.conf stehen, in der Regel sind das mindestens /usr/local/lib und /usr/X11R6/lib
- in einem der Verzeichnisse, die in der Umgebungsvariable LD_LIBRARY_PATH stehen - diese Umgebungsvariable ist in der Regel standardmäßig nicht gesetzt oder leer
Ich brauche Sie im Pfad /home/i686/gcc/
Wie kann ich dem g++ (und der Anwendung) später mitteilen das die Libs NUR dort zu finden sind?
Bitte beachten: Auf Nicht-Windows-Systemen ist das Verzeichnis, in dem die ausführbare Datei liegt, im Gegensatz zu Windows nicht im Suchpfad für Bibliotheken enthalten. Will man es trotzdem so haben, muss man die Umgebungsvariable LD_LIBRARY_PATH selbst entsprechend setzen.
Das Problem ist das ich keine PATH oder andere Umgebungsvariablen ändern oder setzen kann. LD_LIBRARY_PATH ist nicht gesetzt.
Wäre es mein System, würde ich die Bibliothek nach /usr/local/lib installieren. Dort ist sie sauber vom eigentlichen System getrennt und kann trotzdem von mehreren Anwendungen gleichzeitig benutzt werden.
Ich bin lediglich User auf dem Server und habe auch nur in dem Verzeichnis "Bewegungsfreiheit".
Gruß Claas
Also nochmal: Du kannst nicht mal Umgebungsvariablen setzen? Dann geht es nicht.
Eine letzte Möglichkeit fiele mir noch ein: Du kannst die Binaries mit "-Wl,-rpath,/home/i686/gcc" linken. Dadurch wird der Pfad, in dem zur Laufzeit nach Bibliotheken gesucht wird, fest einkompiliert. Allerdings müsstest Du dazu alle Binaries neu bauen!
Den Suchpfad zur Bauzeit kannst Du mit "-L/home/i686/gcc" festlegen. Das ist kein Problem. Es ist nicht notwendig, dem Linker mitzuteilen, dass er die Bibliotheken nur dort suchen soll, weil er auf jeden Fall zuerst dort suchen wird. Wenn wirklich alle nötigen Bibliotheken in /home/i686/gcc liegen, dann werden diese auch benutzt.
Falls Du aus irgendeinem Grund trotzdem willst, dass er den systemweiten Suchpfad, d.h. /lib und /usr/lib, überhaupt nicht benutzt, dann schau in die man page. Die Optionen "-nostdlib" und "-nodefaultlibs" könnten Dich möglicherweise interessieren, obwohl ich glaube, dass Du sie nicht brauchen wirst.
Also nochmal: Du kannst nicht mal Umgebungsvariablen setzen? Dann geht es nicht.
Hmm. Es muss doch eine andere Möglichkeit geben...
Eine letzte Möglichkeit fiele mir noch ein: Du kannst die Binaries mit "-Wl,-rpath,/home/i686/gcc" linken. Dadurch wird der Pfad, in dem zur Laufzeit nach Bibliotheken gesucht wird, fest einkompiliert. Allerdings müsstest Du dazu alle Binaries neu bauen!
Den Suchpfad zur Bauzeit kannst Du mit "-L/home/i686/gcc" festlegen. Das ist kein Problem. Es ist nicht notwendig, dem Linker mitzuteilen, dass er die Bibliotheken nur dort suchen soll, weil er auf jeden Fall zuerst dort suchen wird. Wenn wirklich alle nötigen Bibliotheken in /home/i686/gcc liegen, dann werden diese auch benutzt.
Ja, an so etwas habe ich auch schon gedacht. Wenn ich den gcc mit all sein Bibliotheken selber kompiliere und "meine benötigte" Verzeichnisstrukru verwende, müsste es ja theoretisch klappen.
Ich weiß nur nicht wie ich den gcc builden soll.
P.S.: Ich habe mal etwas ausprobiert: Habe mir die Verzeichnisstruktur des Servers auf meinem Rechner erstellt und die libstdc++.so.6.0.1 von /usr/lib nach /home/i686/gcc verschoben. Und siehe (dieser Teil) wurde vom g++ statisch gelinkt (entneheme ich der Dateigröße) und ich bekam nicht mehr den Fehler "cannot load shared library libstdc++.so.6". Allerdings fehlte nun die libgcc_s.so.1. Die Verschiebung bei dieser Datei hat nicht geklappt, da der g++ nicht ausgeführt werden konnte.
Gruß Claas
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.