7
votes

Erreurs de version LIBSTDC ++ GLIBCXX

Lorsque je compile un programme C ++ sur mon ordinateur à l'aide de g ++ et transférez l'exécutable pour l'exécuter sur mon serveur universitaire, je reçois xxx

Le programme fonctionne bien sur mon ordinateur et je ne fais pas Il faut des privilèges pour installer tout nouveau logiciel sur mes serveurs universitaires.

Toute aide? Merci


2 commentaires

Quelle est la version libstdc ++ de l'université?


@phoxis, 3.4.8 ou plus, semble-t-il.


4 Réponses :


4
votes

La version de libstdc ++. SO.6 est trop âgé sur l'ordinateur universitaire. Vous avez deux options:

  1. Lien statique avec -Static . La bibliothèque C ++ sera alors fusionnée dans le binaire final.
  2. Copiez la version correcte vers quelque part dans votre répertoire de domicile, puis référencez-la en passant par -rpath / chemin> -rpath / chemin / à / la bibliothèque / code> au moment de la construction ou en définissant le ld_library_path Variable d'environnement Pour pointer vers le répertoire contenant le nouveau libstdc ++. SO.6 .

4 commentaires

Merci beaucoup Bdonian, le lien statique fait-il que le programme fonctionne plus lentement lorsqu'il est exécuté dans les serveurs universitaires?


@Tarek, la liaison statique a divers avantages et inconvénients, mais je ne pense pas que vous verrez une grande différence de vitesse, vraiment.


Comme @bdonan a dit qu'il y a de nombreux avantages et inconvénients, mais dans votre cas, le principal sera la taille. Un programme lié statiquement est plus grand que celui connecté de manière dynamique car dans le lien statique, les bibliothèques sont "incluses" à l'intérieur de l'exécutable.


Une meilleure option que -Static serait -Static-libstdc ++ qui relie uniquement libstdc ++ statiquement, pas l'ensemble du programme.



1
votes

Quelles plateformes essayez-vous de compiler? C'est-à-dire "votre ordinateur" et vos "serveurs universitaires"?

Vous pouvez essayer de compiler votre programme avec l'option de liaison statique. Cela générera une exécutable liée statiquement liée à toutes les dépendances libérées chargées déjà.

acclamations,


0 commentaires

8
votes

Il semble que vous utilisiez la bibliothèque standard en tant que bibliothèque partagée (comportement par défaut) lors de la liaison de votre programme à la maison.

SO plutôt que vraiment "relier" la bibliothèque, votre linker résout simplement certains symboles et une autre opération, tout en retardant le chargement réel de la bibliothèque à l'exécution du temps.

Lorsque vous exécutez votre programme chez votre ordinateur universitaire, le chargeur (le programme chargé de la mémoire en mémoire et jette le fil principal) recherche les bibliothèques de vos besoins et essaie de les charger (rechercher ld_library_path à Linux si vous vous sentez curieux).

Le problème ici est que vous reliez votre programme à la maison avec une version du STDLIB qui n'est pas la même version que celle que vous avez à l'université. Ainsi, lorsque le chargeur essaie de trouver la bibliothèque, il échoue, et votre programme ne peut donc pas être exécuté.

Solutions:

a) Pour éviter que tous ces problèmes utilisent une liaison statique au lieu d'une liaison dynamique. Je ne suis pas sûr que cela soit possible avec STDLIB, mais je pense que cela vaut la peine de le tester (voir: http://gcc.gnu.org/onlinedocs/gcc/link-option.html et recherchez "drapeau" -Static ")

B) Vous pouvez essayer de compiler votre programme chez votre ordinateur de l'université afin qu'il utilisera la version là-bas.

c) essayer de savoir quelle version STDLIB est installée là-bas et installer la même version de votre machine compilateur.

d) Vous pouvez essayer de copier votre version domestique de STDLIB dans le même dossier que votre application est. Cela fonctionne généralement car le chargeur a tendance à rechercher des bibliothèques partagées dans le dossier de l'application actuel avant de regarder dans le chemin du chemin dans la variable d'environnement ld_library_path (Linux)

espère que cela aide.

P.s.: Vous avez une belle introduction aux bibliothèques statiques partagées / dynamiques http: // www.network-theory.co.uk/docs/gccintro/gccincintro_25.html

et ici ( 1 commentaires


4
votes

Vous pouvez copier votre version du / usr / libstdc ++. SO.6 à un sous-répertoire de votre répertoire personnel du serveur, disons ~ / lib et Ensuite, exécutez: xxx

ou si vous préférez xxx

et le programme doit charger votre bibliothèque privée au lieu du système un.


0 commentaires