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

C Discussion :

Aide sur les dépendances et sur les librairies dynamiques en C


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 21
    Points : 12
    Points
    12
    Par défaut Aide sur les dépendances et sur les librairies dynamiques en C
    Bonjour,

    Un petit post car il est difficile de trouver des informations précises sur le problème que je rencontre dernièrement. Mon logiciel s'étale sur plusieurs sous-dossiers que je compile chacun séparement, en créant à chaque fois un ".a" rassemblant tous mes ".o" du sous dossier en question.
    Ensuite, je veux créer une librairie dynamique (.so) ressemblant tous mes ".a". J'aurais deux librairies dynamiques à créer, une libA.so et une libB.so.

    Et pour finir, je créé un exécutable qui va utiliser ces deux librairies.
    Seulement je me retrouve avec des problèmes de symboles non définis et c'est là que mes connaissances me lâchent.

    Par exemple, dans un sous-dossier SD1, contenant quatre fichiers : poissonR.c et poissonR.h, poissonM.c, poissonM.h. J'utilise la constante "truite" dans poisson.c qui est déclaré en extern dans poisson.h.
    Cette constante est déclarée dans un autre sous dossier SD2, dans un .c quelconque.

    Au final, à la compilation globale, le shell me lâche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Undefined first referenced
     symbol in file
    truite aquarium.a(poisson.o)
    ...
    ld: fatal: Symbol referencing errors. No output written to LESPOISSONSONTNOSAMIS.S
    *** Error code 1
    make: Fatal error: Command failed for target `LESPOISSONSONTNOSAMIS.S'
    Cependant, dans la librairie dynamique regroupant les sous dossiers SD1 et SD, quand je fais un "nm", truite est bien "defined" (D).
    Ai-je raté quelque chose ? Ce fonctionnement m'est parfois un peu obscur ....
    Merci par avance pour toute aide.

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 21
    Points : 12
    Points
    12
    Par défaut
    J'ai avancé sur le problème, mais c'est pas pour cela que les choses se sont éclairées pour autant.
    J'arrive donc à créer tout de même mes deux librairies dynamiques sans problème de symbole non défini au cours de la compilation et la création de ces librairies.

    Je lance mon exécutable. Ce dernier va créer deux threads. Je lance ensuite la fonction principale de chaque thread (elle est présente dans mes librairies dynamiques, je la récupère par un dlsym) et je voudrais par la suite que chacun de mes threads aillent piocher ses sous fonctions dans sa librairie dynamique associée. Par exemple j'ai une fonction READ_MESSAGE dans chaque librairie, différente l'une de l'autre, et pour le moment mes deux threads appellent la même fonction READ_MESSAGE, au lieu d'appeler celle associée à leur librairie dynamique.

    Je ne trouve franchement rien pour m'aider sur ce sujet et je sais même pas si ma démarche est réalisable, ou si je fais des énormités.
    Ce n'est pas très évident à expliquer mais si quelqu'un a un bon tuto là dessus ou de bonnes docs, je suis preneur.

    un problème similaire et mieux expliqué : http://www.developpez.net/forums/d75...ique-fonction/ (mais pas de réponse)

  3. #3
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    je crois que tu as quelques troubles avec la notion de dynamique et statique...


    Une bibliothèque statique (.a) est à lier avec un (futur) exécutable, et lors de l'opération d'édition de lien, le code de la (des) fonction(s) appellé(es) sera recopié dans le binaire.

    Une bibliothèque dynamique (.so ou .DLL), lors de l'opération d'édition de liens, verra uniquement l'adresse de la fonction insérée dans le binaire sous forme d'un jmp..

    Par conséquent, il me semble assez absurde (à moins qu'aucune des fonctions des biblothèques statiques ne soit appelable par l'extérieur, et que donc tout appel reste interne à la bibliothèque dynamique) de vouloir faire une bibliothèque dynamique à partir de bibliothèques statiques..

    Il faudrait (à mon avis) que toutes tes bibliothèques soient dynamiques afin d'en faire une bibliothèque dynamique...
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 21
    Points : 12
    Points
    12
    Par défaut
    Je ne comprends pas vraiment le raccourci rapide qui est fait par le "par conséquent". L'idée n'est d'ailleurs pas de faire une API mais juste de pouvoir utilisé une partie de code déjà compilé (et très longue à compiler) de façon relativement simple. La méthode marchait très bien jusque là. Le souci que j'ai désormais vient du fait que j'essaye de séparer entièrement la partie A de la partie B. Par exemple, j'avais avant une seule fonction READ_MESSAGE. Elle testait le thread sur lequel elle était exécuté, et redirigé vers READ_MESSAGE_A ou READ_MESSAGE_B suivant le résultat.

    Là, je tente de séparer proprement les fonctions de chaque threads mais sur mes deux fonction READ_MESSAGE, une seule est appelée, que l'exécution se fasse dans le thread A ou le threab B.

    Mon exécutable ne fait pas grand chose en fait : il créé deux threads, un thread A et un thread B. Sur chaque thread, il faut un dlopen (ouverture de sa propre librairie dynamique), puis un dlsym pour exécuter la fonction principale de chacun des threads. Et c'est cette fonction principale qui utilise mes READ_MESSAGE. Donc bêtement, vu que mon thread n'ouvre qu'une seule librairie dynamique, je me suis dit qu'il irait chercher le READ_MESSAGE contenu dans cette librairie. C'est là où je ne comprends pas pourquoi ce n'est pas le cas, et comment il arrive à aller chercher le READ_MESSAGE de l'autre thread ! :/
    Mais je suis peut être seulement très têtu, mais disons que je n'ai pas encore eu d'argument assez convaincant pour me montrer que ça ne marchait pas.

Discussions similaires

  1. Réponses: 6
    Dernier message: 04/12/2014, 14h33
  2. [XL-2007] comparer les données reçues sur un mois et completer les données manquantes par une macro.
    Par wisemanvsfatboy dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 29/11/2010, 17h16
  3. Réponses: 12
    Dernier message: 23/12/2009, 10h56
  4. Réponses: 5
    Dernier message: 19/10/2006, 23h25

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