2011-11-22 2 views
2

J'ai un programme utilisant gtkmm, gtkglextmm et exiv2.Quelque chose comme .dll sur Linux - comment les obtenir?

Je veux inclure ces bibliothèques avec l'exécutable, car l'application ne fonctionnera pas si l'utilisateur ne les a pas sur son système. Sur les fichiers Windows .dll résolu le problème (je les ai mis dans le même répertoire que le fichier de sortie).

Comment attacher des bibliothèques similaires sur Linux? Y a-t-il un outil qui aide à cela? Je ne peux pas forcer l'utilisateur à installer des dépendances.

+2

Sous Linux, l'équivalent d'un .dll est un "objet partagé dynamique", ou un .so. Vous pouvez lier statiquement les bibliothèques requises dans votre exécutable, mais ce n'est vraiment pas la meilleure pratique. Voir la réponse de David Heffernan. Vous n'avez pas besoin de forcer l'utilisateur à installer les dépendances; vous dites simplement à l'utilisateur que c'est son choix et qu'il ne peut pas exécuter votre application sans ces dépendances. –

+0

Si votre programme est un logiciel libre (par exemple sous licence GPL ou LGPL), vous obtiendrez probablement de l'aide pour l'empaqueter au sein de distributions majeures (et parfois même, une personne sympathique l'empaquetera pour vous). –

+0

William J'ai lu quelque part que vous ne pouvez pas faire de liaison statique avec gtk (et gtkmm). Je me demande si c'est vrai ... Aussi, comme je l'ai écrit ci-dessous la réponse de David Heffernan - je dois faire fonctionner ce programme même si l'utilisateur est trop paresseux pour installer des dépendances par lui-même. – Marco

Répondre

4

Mieux encore, utilisez le système de paquetage de la ou des distributions que vous voulez cibler, p. Ex. .deb emballage sur Debian/Ubuntu/Mint (avec aptitude ou apt-get, s'utilisant dpkg), Yum/Rpm sur Redhat/Fedora, etc etc

DLL-s sont appelés shared libraries (fichiers nommés *.so) sur Linux (en ELF format, utilisez objdump, nm ... pour les explorer, et gcc -fPIC -shared pour les construire). Ils peuvent être chargés par programme avec dlopen & dlsym. Attention, il existe des différences importantes entre les fenêtres DLL-s & Linux * .so (dynamic linking n'a pas la même signification sous Windows & Linux)

0

Vous pouvez écrire simple script sh pour démarrer votre programme:

#!/bin/sh 
LD_LIBRARY_PATH=/path/to/intall/directory 
path/to/your/exe 

et mettre donc bibliothèques/chemin/vers/intall/répertoire

+1

Cela ne résout pas les problèmes de dépendance (les détails varient selon les distributions), et je ne recommande pas cela. –

+0

Pourquoi? ABI de choses de base comme glibc changé rarement, comme des choses comme le protocole X11. Donc, si vous avez d'autres bibliothèques "so" avec votre application, vous pouvez l'exécuter sans problèmes. Maintenant, imaginez la situation, lorsque vous utilisez quelque chose comme qt 4.6, et vous devez montrer comment votre application ressemble à l'utilisateur. Mais l'utilisateur n'a qu'une ancienne machine Debian. Que faites-vous, mettre à jour tous les systèmes pour exécuter votre application une fois? – fghj

+0

Oui, car Qt a tellement de dépendances qu'il ne vaut pas la peine de les résoudre manuellement. Si nécessaire, lancez un "nouveau" système dans un environnement chroot-ed - mais même cela ne fonctionnera pas avec un ancien noyau et une libc récente –

10

pratique standard sur Linux est de ne pas redistribuer vos dépendances. Cela crée simplement de grandes quantités de duplication. Vous devriez plutôt spécifier les dépendances dans votre paquet d'installation et laisser le gestionnaire de paquets les résoudre.

+0

Eh bien, j'ai besoin de faire fonctionner mon programme sur Linux et quelqu'un est paresseux pour installer des dépendances. Je sais quelle est la pratique standard, mais j'ai besoin de faire cela comme avec les DLL sur Windows. – Marco

+4

Ce n'est pas Windows. Il est trivial d'installer les paquets avec votre gestionnaire de paquets préféré. C'est simplement la façon de le faire. Ne pas combattre la plate-forme. –

Questions connexes