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 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. P> Toute aide?
Merci p> p>
4 Réponses :
La version de libstdc ++. SO.6 code> est trop âgé sur l'ordinateur universitaire. Vous avez deux options: p>
-Static code>. La bibliothèque C ++ sera alors fusionnée dans le binaire final. LI>
-rpath / chemin> -rpath / chemin / à / la bibliothèque / code> au moment de la construction ou en définissant le
ld_library_path Code> Variable d'environnement Pour pointer vers le répertoire contenant le nouveau
libstdc ++. SO.6 CODE>. LI>
ol>
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 code> serait
-Static-libstdc ++ code> qui relie uniquement libstdc ++ statiquement, pas l'ensemble du programme.
Quelles plateformes essayez-vous de compiler? C'est-à-dire "votre ordinateur" et vos "serveurs universitaires"? p>
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à. P>
acclamations, p>
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. P>
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. P>
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 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é. P>
Solutions: strong> p>
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 ") p>
B) Vous pouvez essayer de compiler votre programme chez votre ordinateur de l'université afin qu'il utilisera la version là-bas. P>
c) essayer de savoir quelle version STDLIB est installée là-bas et installer la même version de votre machine compilateur. P>
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 espère que cela aide. P>
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 P>
ld_library_path code> à Linux si vous vous sentez curieux). P>
ld_library_path code> (Linux) P>
Vous pouvez copier votre version du ou si vous préférez p> et le programme doit charger votre bibliothèque privée au lieu du système un. P > p> / usr / libstdc ++. SO.6 code> à un sous-répertoire de votre répertoire personnel du serveur, disons
~ / lib code> et Ensuite, exécutez:
Quelle est la version libstdc ++ de l'université?
@phoxis, 3.4.8 ou plus, semble-t-il.