Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 29/04/2009, à 17:11

kevlar

Une question sur le linking

Bonjour à tous smile

Je développe un programme qui utilise libpoppler. Ma machine de développement est sous Ubuntu Hardy.
Je teste mon programme sur mon portable qui tourne sous Debian Lenny. Et là, un problème : la machine sous Lenny refuse de démarrer le programme compilé, car libpoppler-glib.so.2 est absente. C'est vrai, car sous la machine 'lenny', sont présentes les libpopller 1,3,4 yikes.
Bon, où est le rapport avec Ubuntu ? Sur la machine avec Hardy, la seule bibliothèque partagée est précisément  libpoppler-glib.so.2 !
Bien évidemment, il suffit sous Lenny de créer un lien symbolique pour que tout rentre dans l'ordre, mais ce n'est pas sérieux !
D'où ma question : y-a-t-il une option de compilation pour faire comprendre à GCC que je veux lier mon programme à Liboploppler en général et non pas à celle qui se trouve sur la machine de développement ?:rolleyes:

Hors ligne

#2 Le 29/04/2009, à 17:32

michubuntu

Re : Une question sur le linking

Bonjour,
il le meilleur moyen est de lier statiquement ta biliothèque.

Pour cela il te faut installer la biliothèque statique de libpoppler (un fichier .a)
ensuite à l'edition de lien il te faut remplacer le link dynamique :
option "-lpopler-glib" certainement
par la librairie statique.

Ouai c'est pas très clair comme ça, un exemple peut être :
lier dynamiquement :
gcc -L<chemin_vers_librairie_dynamique> -l<nom_de_la_librairie> main.c -o progTest

Pour lier statiquement :
gcc <chemin_vers_librairie_statique/nom_de_la_librairie.a> main.c -o progTest

ainsi la bibliothèque est inclue dans ton executable.


«...l’premier qui m’fout la honte, J’LE’FOUS SOUS HURD AVEC LE DOUBLE-LIVE DE STALL-MAN À TOKYO EN GUISE DE MAN ! »
L'Histoire des Pingouins - CHAPITRE 30. ÉVASION par Antoine Bellot.
http://tnemeth.free.fr/fmbl/linuxsf/

Hors ligne

#3 Le 29/04/2009, à 17:45

kevlar

Re : Une question sur le linking

d'abord merci pour ta réponse, qui est claire !
Mais j'avais compris que l'avantage de Linux, c'était justement d'éviter, de préférence, de lier statiquement les bibliothèques !  Bon, mon programme fait actuellement 135 Ko avec les liens dynamiques. Mais je crains le pire en liant statiquement !
Comment se fait-il que l'utilisateur final puisse être dépendant d'un 'détail' pareil (c'est vrai que l'on rencontre parfois des programmes qui demandent comme ça une version "précise" de la bibiothèque, mais c'est quand même rare.

Hors ligne

#4 Le 29/04/2009, à 18:46

Keldath

Re : Une question sur le linking

Ça m'intéresse aussi d'en savoir d'avantage étant confronté au même problème.
Il y a la solution de recompiler le programme pour chaque système, cependant on a bien des paquets binaires qui dépendent d'une lib version X ou supérieur, qu'on ait la lib vX ou vX+1, le binaire fonctionne pourtant bien.

Hors ligne

#5 Le 29/04/2009, à 18:59

Link31

Re : Une question sur le linking

c'est vrai que l'on rencontre parfois des programmes qui demandent comme ça une version "précise" de la bibiothèque, mais c'est quand même rare

Non ce n'est par rare, c'est même quasiment systématique. Si le soname a changé (libpoppler-glib.so.3 => libpoppler-glib.so.4), ça signifie que l'ABI a changé et que ton programme ne tournera jamais avec la nouvelle bibliothèque sans avoir été recompilé. Tous les programmes se lient avec un soname particulier pour chaque bibliothèque, et la bibliothèque elle-même ne change pas de soname tant que les modifications de ses développeurs ne cassent pas les programmes qui en dépendent.

Puisque Debian stable et Ubuntu "stable" ne fournissent pas la même version de libpoppler-glib, tu n'as pas le choix : il te faut fournir un paquet Debian et un paquet Ubuntu.

Ou tout simplement fournir les sources de ton programme. Tous ces "problèmes" de bibliothèques viennent du fait qu'historiquement, les programmes sous UNIX étaient distribués sous forme de code source et jamais sous forme de binaire précompilé. Laisse plutôt aux mainteneurs des distributions binaires telles que Debian ou Ubuntu le soin de packager ton programme. Ce n'est pas ton rôle de le faire en tant que développeur.

Hors ligne

#6 Le 29/04/2009, à 19:04

Keldath

Re : Une question sur le linking

Merci pour cette réponse claire.

Hors ligne

#7 Le 29/04/2009, à 19:26

kevlar

Re : Une question sur le linking

Link31 a écrit :

c'est vrai que l'on rencontre parfois des programmes qui demandent comme ça une version "précise" de la bibiothèque, mais c'est quand même rare

Non ce n'est par rare, c'est même quasiment systématique. Si le soname a changé (libpoppler-glib.so.3 => libpoppler-glib.so.4), ça signifie que l'ABI a changé et que ton programme ne tournera jamais avec la nouvelle bibliothèque sans avoir été recompilé. Tous les programmes se lient avec un soname particulier pour chaque bibliothèque, et la bibliothèque elle-même ne change pas de soname tant que les modifications de ses développeurs ne cassent pas les programmes qui en dépendent.

Puisque Debian stable et Ubuntu "stable" ne fournissent pas la même version de libpoppler-glib, tu n'as pas le choix : il te faut fournir un paquet Debian et un paquet Ubuntu.

Ou tout simplement fournir les sources de ton programme. Tous ces "problèmes" de bibliothèques viennent du fait qu'historiquement, les programmes sous UNIX étaient distribués sous forme de code source et jamais sous forme de binaire précompilé. Laisse plutôt aux mainteneurs des distributions binaires telles que Debian ou Ubuntu le soin de packager ton programme. Ce n'est pas ton rôle de le faire en tant que développeur.

+1

Mais quand même, le côté "grand public" dans tout ça ? On va devoir devenir soit des Ubuntu-dépendants, soit des Mandriva-dépendants, etc ...

Hors ligne