libstdc++ GLIBCXX des erreurs de version
quand je compile un programme en c++ dans mon ordinateur à l'aide de g++ et le transfert de l'exécutable à lancer sur mon serveur de l'université, je reçois
./main: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.9' not found (required by ./main)
./main: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.14' not found (required by ./main)
./main: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.11' not found (required by ./main)
Le programme fonctionne bien sur mon ordinateur, et je n'ai pas de privilèges d'installer un nouveau logiciel sur mon université serveurs.
de l'aide ?
Grâce
qu'est-ce que la bibliothèque libstdc++ version à l'université ?
3.4.8 ou plus, il me semble.
3.4.8 ou plus, il me semble.
OriginalL'auteur Tarek | 2011-08-22
Vous devez vous connecter pour publier un commentaire.
Il semble que vous êtes à l'aide de la bibliothèque standard, comme une bibliothèque partagée (comportement par défaut) lors de la liaison de votre programme à la maison.
Donc, plutôt que de vraiment "lier" à la bibliothèque, votre linker juste résout certains symboles et effectue une autre opération, tout en retardant le chargement réel de la bibliothèque run-time.
Lorsque vous exécutez votre programme dans votre ordinateur de l'université, le chargeur (le programme qui se charge de votre programme dans la mémoire et lance le thread principal) recherche pour les bibliothèques de vos besoins du programme et tente de les charger (cherchez
LD_LIBRARY_PATH
sous linux si vous vous sentez curieux).Le problème ici est que vous lier votre programme à la maison avec une version de la stdlib qui n'est pas la même version que ce que vous avez à l'université. Ainsi, lorsque le chargeur essaie de trouver la bibliothèque, il échoue, et si votre programme ne peut pas être exécuté.
Solutions:
a) Pour éviter tous ces problèmes utiliser la liaison statique au lieu de la liaison dynamique. Je ne suis pas sûr si cela est possible avec la stdlib, mais je pense qu'il vaut la peine de le tester (voir: http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html et recherchez "statique" drapeau)
b) Vous pouvez essayer de compiler votre programme à votre ordinateur de l'université de sorte qu'il utilise la version.
c) Essayer de savoir qui stdlib version y est installé et installer la même version de votre compilateur machine.
d) Vous pouvez essayer de copier votre version à la maison de la stdlib dans le même dossier de votre demande. C'est généralement parce que le chargeur a tendance à chercher les bibliothèques partagées dans le courant du dossier de l'application avant de regarder le chemin d'accès défini dans la variable d'environnement
LD_LIBRARY_PATH
(linux)Espère que ça aide.
P. S.:
Ici vous avez une belle introduction à la statique vs partagé/bibliothèques dynamiques http://www.network-theory.co.uk/docs/gccintro/gccintro_25.html
Et ici (http://en.wikipedia.org/wiki/Library_%28computing%29) n'est pas très joli, mais plus complet description de bibliothèque.
-static
serait-static-libstdc++
qui des liens de libstdc++ statique, pas l'ensemble du programme.OriginalL'auteur thamurath
La version de
libstdc++.so.6
est trop ancien sur l'ordinateur de l'université. Vous avez deux options:-static
. La bibliothèque C++ seront fusionnés dans le binaire.-rpath /path/to/library/directory
au moment de la construction ou de la définition duLD_LIBRARY_PATH
variable d'environnement pour pointer vers le répertoire contenant le plus récentlibstdc++.so.6
.la liaison statique a divers avantages et inconvénients, mais je ne pense pas que vous allez voir beaucoup de différence de vitesse, vraiment.
@bdonian dit qu'il y a de nombreux avantages et des inconvénients, mais dans votre cas, la principale sera la taille. Statiquement le programme est plus grande que la liée de façon dynamique un, parce que dans la statique-liés les uns les bibliothèques sont "inclus" dans le fichier exécutable.
Une meilleure option que
-static
serait-static-libstdc++
qui des liens de libstdc++ statique, pas l'ensemble du programme.OriginalL'auteur bdonlan
Vous pouvez copier votre version de la
/usr/lib/libstdc++.so.6
à un sous-répertoire de votre répertoire de base du serveur, dire~/lib
et de lancer:Ou si vous préférez
Et le programme devrait se charger de votre bibliothèque privée à la place de celui du système.
OriginalL'auteur rodrigo
Quelles sont les plateformes que vous essayez de compiler? c'est à dire " Votre ordinateur et que votre Université serveurs ?
Vous pouvez essayer de compiler votre programme avec la liaison statique option. Cela va générer un exécutable lié statiquement avec toutes les lib dépendances chargé déjà.
Acclamations,
OriginalL'auteur quarkonium