2010-04-27 3 views
2

Mon programme est écrit en C++, en utilisant GCC sur Ubuntu 9.10 64 bits. Si dépend de /usr/lib64/libstdc++.so.6 qui pointe vers /usr/lib64/libstdc++.so.6.0.13. Maintenant, je copie ce programme sur le système vierge Ubuntu 7.04 et j'essaie de l'exécuter. Il ne fonctionne pas, comme prévu. Puis-je ajouter au répertoire du programme les fichiers suivants:Comment installer le programme en fonction de la bibliothèque libstdC++

  • libstdC++ so.6.0.13
  • libstdC++ so.6 (liens vers libstdC++ so.6.0.13.)

Exécuter.. commande:

LD_LIBRARY_PATH=. ./myprogram 

Maintenant tout est OK. La question: comment puis-je écrire un script d'installation pour un tel programme? Le fichier myprogram lui-même doit être placé dans/usr/local/bin. Que puis-je faire avec les dépendances? Par exemple, sur l'ordinateur de destination, le lien /usr/lib64/libstdc++.so.6 pointe vers /usr/lib64/libstdc++.so.6.0.8. Que puis-je faire avec ça?

Remarque: le programme est de source fermée, je ne peux pas fournir de code source et makefile.

Répondre

3

Si vous travaillez sur Ubuntu, faire un .deb (paquet Debian) semble aller. Here est un lien pour vous aider à démarrer.

Votre colis indiquera cela dépend d'autres paquets (généralement les paquets qui comprend libstdc++.so.6.0.13 - je suppose que le nom du package est quelque chose comme libstdc++) et dépendances seront installées lorsque vous installez votre propre paquet en utilisant dpkg -i <yourpackage>.deb.

Ensuite, vous pourrez le désinstaller en utilisant dpkg -r <yourpackage>.

Quoi qu'il en soit, jamais navire de tels fichiers standards avec votre propres archives. Les dépendances existent dans ce but précis.

Espérons que ça aide.

+0

Qu'en est-il des distributions Linux non-Debian? –

+0

@Alex Farber: De nombreuses distributions Linux supportent RPM. Les archives bash auto-extractibles sont également une option, bien que l'utilisation de paquets d'installation de systèmes natifs comme deb ou rpm soit meilleure et plus propre solution –

+0

@Dmitry Yudakov: bel argument en effet. De plus, il existe des outils (comme 'alien') qui peuvent convertir .rpm en .deb (et .deb en .rpm) si vous ne voulez vraiment pas les créer manuellement. – ereOn

1

Le vrai problème est que vous essayez d'installer un binaire qui utilise des versions plus récentes des bibliothèques communes que celles disponibles sur Ubuntu 9.10. La meilleure option devrait être de faire une cible spécifique pour l'ancien Ubuntu 7.10 et de le compiler avec les anciennes bibliothèques (c'est un backport).

Ensuite, vous devriez faire deux (ou plus) paquets .deb, un pour Ubuntu 9.10 et un pour Ubuntu 7.10.

Une autre possibilité est de continuer à faire ce que vous faites maintenant: définir LD_LIBRARY_PATH pour pointer vers la version souhaitée de libstdC++ et d'autres bibliothèques nécessaires. Vous venez de définir cette variable d'environnement dans un script de shell de lancement. Dans votre script, vous vérifiez si les nouvelles bibliothèques sont disponibles et vous ne définissez votre LB_LIBRARY_PATH (par exemple/usr/local/lib/myprogram /) que si nécessaire. Mais comme d'autres l'ont souligné: c'est une très mauvaise pratique. Quoi qu'il en soit, n'essayez jamais de mettre ces bibliothèques fournies à leur place standard dans Ubuntu 9.10, vous risqueriez de franchir le système cible et causer des problèmes de mise à jour pour les utilisateurs ou votre programme si ces bibliothèques sont officiellement rétroportées un jour. Mais si vous choisissez d'inclure votre propre ensemble de bibliothèques système, il y a encore une autre solution que celle ci-dessus: il suffit de lier ces bibliothèques de façon statique.Si un programme est le seul utilisateur d'une bibliothèque, comme cela sera probablement le cas dans le scénario ci-dessus, vous perdrez tous les avantages d'utiliser une bibliothèque dynamique partagée, alors pourquoi s'embêter à l'utiliser? Et avec les bibliothèques statiquement liées, vous n'aurez pas à les installer.

+0

Si la version de la bibliothèque est vraiment un problème, il peut encore le compiler pour le système d'exploitation cible en utilisant le 'libstdC++' disponible. A moins qu'il n'ait besoin d'une fonctionnalité particulière qui n'existe que dans libstdC++ -. 6.0.13: alors oui, utiliser un backport est la solution. – ereOn

+0

@ereOn: oui, c'est ce que je suggère. Mais je me demande si le problème d'OP n'est pas avec l'environnement de construction plus qu'avec l'installation. Il a besoin d'un environnement Ubuntu 7.10 pour compiler ou modifier ses paramètres d'environnement de compilation pour compiler vers d'autres cibles que 9.10. – kriss

Questions connexes