IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

GCC Discussion :

Dépendances introuvables pour la librairie partagée


Sujet :

GCC

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2017
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 35
    Points : 34
    Points
    34
    Par défaut Dépendances introuvables pour la librairie partagée
    Salut tout le monde, j'essaie d'apprendre à compiler une librairie et la linker dans un programme, j'ai choisi la SDL pour ça. Je compile avec gcc sous Ubuntu.
    Voici ce que j'ai fait : j'ai téléchargé l'archive de la SDL2 et compilé le code avec make, puis j'ai déplacé les fichiers vers mon projet : les headers dans include, les objets .o, les librairies statiques .a, la librairie partagée "libSDL2-2.0.so.0.18.2" (et un tas d'autres fichiers se trouvant dans "build") dans un dossier lib.
    J'ai ensuite compilé mon programme avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc -o programme -I../include main.c ../lib/libSDL2-2.0.so.0.18.2
    Mais en lançant le programme, ce message s'affiche
    error while loading shared libraries: libSDL2-2.0.so.0: cannot open shared object file: No such file or directory
    J'ai beau essayé 100 façons de compiler le programme, en ajoutant le chemin de lib avec -L, les librairies statiques avec -l... rien ne marche.

    Note importante : les dépendances de la librairie partagée .so sont introuvables, ça affiche libSDL2-2.0.so.0 => not found quand je fais ldd programme. Apparemment il cherche les dépendances dans /lib/x86_64-linux-gnu.

    Comment résoudre ce problème de dépendances ? À quel niveau il faut agir : compilation du programme ? compilation de la SDL ?...

  2. #2
    Membre expérimenté
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juillet 2020
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juillet 2020
    Messages : 352
    Points : 1 380
    Points
    1 380
    Par défaut
    Bonjour,
    Si tu un environnement de dèv sain il va falloir :
    • utiliser ton gestionnaire de paquets pour installer pkg-tool et libsdl2 (en version dev pour les headers et pas uniquement la version runtime) ;
    • utiliser pkg-tool pour obtenir les infos sur la SDL2, infos que tu utiliseras sur la ligne de commande gcc ;
    • apprendre à utiliser au moins builder (comme make) parce que ça te simplifiera la vie de plusieurs ordres de grandeurs ;
    • apprendre à structurer ton projet pour faire de la compilation séparée ;
    • suivre un tuto … ça ne fait jamais de mal.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2017
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 35
    Points : 34
    Points
    34
    Par défaut
    Citation Envoyé par WhiteCrow Voir le message
    Bonjour,
    Si tu un environnement de dèv sain il va falloir :
    • utiliser ton gestionnaire de paquets pour installer pkg-tool et libsdl2 (en version dev pour les headers et pas uniquement la version runtime) ;
    • utiliser pkg-tool pour obtenir les infos sur la SDL2, infos que tu utiliseras sur la ligne de commande gcc ;
    • apprendre à utiliser au moins builder (comme make) parce que ça te simplifiera la vie de plusieurs ordres de grandeurs ;
    • apprendre à structurer ton projet pour faire de la compilation séparée ;
    • suivre un tuto … ça ne fait jamais de mal.
    En fait je veux travailler de façon professionnelle, je ne veux pas me contenter d'utiliser apt ni pkg-tool, ni de suivre bêtement un tuto. J'essaye d'apprendre à compiler du code source (SDL par exemple) et l'intégrer à un programme existant (un simple main.c dans mon cas). Et je dois le faire moi-même, aucun programme ne doit automatiser quoique ce soit (apart gcc pour compiler le code C).

  4. #4
    Membre expérimenté
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juillet 2020
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juillet 2020
    Messages : 352
    Points : 1 380
    Points
    1 380
    Par défaut
    Citation Envoyé par Kawamx Voir le message
    En fait je veux travailler de façon professionnelle, je ne veux pas me contenter d'utiliser apt ni pkg-tool, ni de suivre bêtement un tuto.


    Ce que tu essaye de faire est tout sauf professionnel. Il y a des outils, il faut juste savoir pourquoi ils existent et apprendre à les utiliser.

    Citation Envoyé par Kawamx Voir le message
    J'essaye d'apprendre à compiler du code source (SDL par exemple) et l'intégrer à un programme existant (un simple main.c dans mon cas). Et je dois le faire moi-même, aucun programme ne doit automatiser quoique ce soit (apart gcc pour compiler le code C).
    Il va falloir commencer à apprendre comment l'OS gère les bibliothèques dynamiques. Comment tu lies un programme à une bibliothèque dynamique ; pour ce dernier point, gcc n'est qu'un front-end à ce qu'on appelle un éditeur de liens. Parce que si tu n'utilises GCC que pour «compiler du code» tu n'obtiendra même jamais d'exécutable. «compiler» est, en très gros, l'action de transformer un code source sortant du préprocesseur en un format binaire particulier, un fichier objet (et il y a plusieurs type et format de fichiers objets). Créer un exécutable c'est utiliser un ou plusieurs fichiers objet et les lier (c'est le rôle de l'éditeur de lien aka linker) pour créer un fichier dans un format particulier (par exemple ELF64 LSB PIE) qui sera adapté à une plateforme particulière.
    Quand tu demandes à ton OS de lancer un exécutable, il lit ce fichier, fait plein de chose comme entre autre déterminer de quelles bibliothèques dynamiques il dépend. L'OS va ensuite rechercher dans des endroits précis ces bibliothèques dynamiques …

    Alors soit tu utilises un gestionnaire de paquet qui va installer tout comme il faut où il faut, soit tu compiles à partir de sources et tu utilises le builder demandé (make, meson, cmake ou autre) que tu auras correctement configuré pour ta plateforme pour installer lesdites bibliothèques dynamiques.

    Une dernière solution est de compiler une bibliothèque en version statique. Tu pourras ensuite lier cette bibliothèque statique aux binaires de ton projet. L'avantage évident est que tu n'as plus besoin de l'OS pour faire une édition de liens dynamique, que tu ne dépends pas de la version installée sur la plateforme ou même de t'inquiéter si elle l'est ou non. Les désavantages (tout relatif) sont l'augmentation de la taille de ton binaire, la duplication de code ne mémoire, la complexification des upgrades, …

    Sache que peu importe la solution que tu souhaites implémenter, il va te falloir apprendre pas mal de choses et surtout d'outils indispensables comme un debuger (gdb), un memory profiler (valgrind), un profiler (gprof), la chaîne de compilation (gcc avec tous les backends et même les binutils), les traceurs système (strace), les builder (make mais ptêt surtout meson dans ton cas), … la liste n'est pas exhaustive évidemment car on apprend tous les jours.

    Mais bon, si tu veux vraiment «ne rien automatiser» et comprendre comment tout fonctionne en mettant les mains dans le cambouis : il y a LFS, linux from scratch.

    Edit:
    Un cartoon d'xkcd à méditer


  5. #5
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 766
    Points : 43 927
    Points
    43 927
    Par défaut
    pour compiler la SDL une fois le code source téléchargé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ./configure
    make
    make install
    make va compiler, make install copier les fichiers au bon endroit

    Tu ne peux pas donner le nom de la bibliothèque comme ça dans les paramètres gcc.

    Si tu devais le faire à la main, il te faudrait copier la bibliothèque dans /lib64 (ou /lib pour le 32 bits), créer un lien symbolique sur le numéro majeur (
    libSDL2-2.0.so.0 dans ton cas) et lancer ldconfig. Tu peux placer la bibliothèque dans un autre dossier tant que tu paramètres ldconfig. (fichiers de configs dans /etc/ld.so.conf.d)

    Sur un projet comme SDL, je te recommanderais plutôt l'installation via les paquets systèmes, car le jour ou tu as des paquets à installer dépendants de la SDL, ça risque de casser ton install (normalement ça devrait pas toucher ta bibliothèque mais ça peut changer le lien numéro majeur ça principe de précaution). Ou sinon placer ta bibliothèque dans un autre dossier que /lib64. Ca peut servir si ton code dépend d'une version de SDL qui casserait éventuellement la compatibilité et que tu dois faire cohabiter ton produit avec un autre, mais dans ce cas il faudrait plutôt rendre ton code compatible avec les dernières versions. Exemple donné pour la forme, mais ça a déjà été le cas avec python2 vers python3, les vieilles versions de Qt il me semble.

    Ensuite, regardes du coté de make. Tu peux considérer que ça fait partie de la chaine de compilation.
    Dès que tu crée un projet sérieux, tu vas te retrouver à devoir compiler plusieurs fichiers .c make permettra de ne pas tout recompiler en cas de modification mais juste le .c modifié entre autre. Et si tu utilises un frontend type cmake, c'est simple à utiliser et simplement paramétrable (ajout de bibliothèques, gestion des options de compilations, copie des fichiers à leur emplacement avec make install.. .)

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2017
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 35
    Points : 34
    Points
    34
    Par défaut
    Merci pour les conseils et infos, j'ai pu résoudre partiellement le pb de dépendances, je les ais tout simplement installés avec make install bien que je voulais faire autrement au départ, en tout cas ça semble être le moyen le plus simple et plus sur.
    Mais je rencontre un nouveau problème, quand j'exécute le programme j'ai ce message : "Could not create window: No available video device".
    J'ai debuggé le programme et juste avant l'erreur, gdb indique "Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
    J'ai tenté un DISPLAY=:0 ./programme, pas de résultat.

    J'ignore d'où vient le problème mais ne vous embêtez pas trop pour moi, d'autant que là c'est clairement pas un problème de GCC. Ça me semble être lié aux drivers ou xorg, enfin j'en sais rien du tout mais c'est un peu hors sujet par rapport au forum.

  7. #7
    Membre expérimenté
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juillet 2020
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juillet 2020
    Messages : 352
    Points : 1 380
    Points
    1 380
    Par défaut
    Citation Envoyé par Kawamx Voir le message
    Merci pour les conseils et infos, j'ai pu résoudre partiellement le pb de dépendances, je les ais tout simplement installés avec make install bien que je voulais faire autrement au départ, en tout cas ça semble être le moyen le plus simple et plus sur.
    … quand on a bien configuré le tout lors du ./configure … et cela dépend forcément de ta plateforme pour laquelle les valeurs par défaut ne sont pas automatiquement les bonnes …

    Citation Envoyé par Kawamx Voir le message
    Mais je rencontre un nouveau problème, quand j'exécute le programme j'ai ce message : "Could not create window: No available video device".
    J'ai debuggé le programme et juste avant l'erreur, gdb indique "Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
    J'ai tenté un DISPLAY=:0 ./programme, pas de résultat.

    J'ignore d'où vient le problème mais ne vous embêtez pas trop pour moi, d'autant que là c'est clairement pas un problème de GCC. Ça me semble être lié aux drivers ou xorg, enfin j'en sais rien du tout mais c'est un peu hors sujet par rapport au forum.
    Le premier truc, si tu tiens à faire un tant soit peu généraliste est au moins d'utiliser une version identifiée sur github de la libsdl, de lire la doc (pour éviter un RTFM), debien configurer le process de build pour ta plateforme puis de lancer les tests et les exemples avant d'essayer de l'installer. Sans compter qu'il te faudra utiliser auparavant la même méthode sur les dépendances requises (et optionnelles suivant ta conf) de la libsdl2.

    Ceci est normalement fait par le gestionnaire de paquets (et si tu veux un build à partir des sources tu as gentoo).

    Ou alors tu lis la doc pour comprendre comment lier une bibliothèque statique que tu auras compilé à partir des sources (et dans le cas de la libsdl il va falloir l'indiquer lors de la configuration du process de build).

Discussions similaires

  1. Réponses: 2
    Dernier message: 04/01/2017, 10h47
  2. Réponses: 5
    Dernier message: 11/09/2014, 17h18
  3. [XL-2003] pilote isam introuvable pour copie d'un fichier fermé partagé
    Par jasol dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 08/03/2012, 16h40
  4. [UNIX Forte 6.1 G++] pbl chargement de librairie partagée
    Par claudio.matzke dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 09/10/2003, 14h45
  5. Réponses: 2
    Dernier message: 30/09/2003, 15h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo