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

Autres éditeurs Discussion :

Comment lier les sources d'une lib à son nom ?


Sujet :

Autres éditeurs

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Inscrit en
    Mars 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2007
    Messages : 5
    Par défaut Comment lier les sources d'une lib à son nom ?
    Hello tout le monde,

    J'ai un soucis avec la génération d'une bibliothèque (statique, mais elle pourrait être dynamique je pense que ce serait pareil). J'utilise Visual Studio 2005.

    En général, lorsqu'on écrit un programme utilisant des fonctions externes, on doit lier le programme avec un fichier .lib content l'implémentation des fonctions externes appelées. Exemple : lorsqu'on utilise la lib boost::serialization, on est tenu d'inclure le fichier "boost_serialization_1_33_1_mt.lib". Si par mégarde on oublie d'inclure ce fichier, le linker nous rappelle à l'ordre avec une erreur du genre :
    "error LNK1181: cannot open file boost_serialization_1_33_1_mt.lib"

    Lorsque je fais la même chose avec une bibliothèque écrite par mes mains, celà se passe autrement. J'oublie d'inclure ma bibliothèque mylib_1_0_4.lib, et le compilateur m'affiche un message du genre :
    "error LNK2019: unresolved external symbol 'int thiscall MaFonction(void).."

    Pour résumer, avec une librairie compilée par des pros, le linker est capable de dire de quelle biblithèque proviennent les fonctions dont l'implémentation n'a pas été trouvée, par contre, avec une librarie perso, le linker ne sait pas faire le matching et affiche simplement le noms des fonctions non trouvées.

    Comment faire pour compiler une lib perso avec la faculté d'associer les fonctions au nom de la librarie ?

    Merci beaucoup !

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    D'abord, dans le code, il faut inclure le fichier d'en-tete (typiquement avec un #include "nom_du_fichier.h"), et il faut signaler à l'éditeur de liens qu'il doit lier la bibliothèque donnée (typiquement en fournissant un -inombibliothèque et un -Idossier/ou_trouver_la_bibliotheque) dans la commande de compilation (ou toute autre manoeuvre similaire dépendant de l'EDI utilisée )

    L'idée de faire un #include "mabibliotheque.lib" ne m'est vraiment jamais venue (j'espère que ce n'est pas cela que tu fais )

    L'astuce, c'est que boost utilise principalement un principe nommé "template" (modèle, si tu préfères en français ) et que l'une des particularités de ces "template" est... que c'est tout à fait générique, et que le code final (aka: qui sera en définitive mis dans l'exécutable) nécessitera d'adapter le code qu'il trouve dans le fichier .lib... à ce qui est réellement sérialisé (selon ton exemple)

    S'il ne trouve pas le fichier .lib, cela revient à lui dire "tu dois remplacer tout les blabla par truc et tous les bidule par machin"...sans lui donner la phrase dans laquelle il doit les remplacer

    On comprend qu'il rechigne à faire le remplacement en te disant "impossible d'ouvrir le fichier"

    Pour ce qui est de tes propres bibliothèques, le problème est différent... Si du moins, tu travailles sans avoir recours aux template :

    Pour chaque unité de compilation (1 fichier *.c ou *.cpp + les en-têtes inclues), le compilateur crée une liste des fonctions définies dont l'éditeur de liens va se servir pour faire correspondre les appels à l'adresse à laquelle commence réellement la fonction appelée.

    Et, si tu ne dis pas à l'éditeur de lien d'"aller voir dans tel fichier pour trouver les fonctions", bête comme il l'est, il ne pensera pas à le faire de lui-même

    Et donc, quand tu compilera ton projet, il trouvera l'appel à une fonction (exemple un a=mafonct() )... mais il ne trouvera pas... l'adresse mémoire vers laquelle il doit faire pointer cet appel...

    Et là aussi, on peut comprendre qu'il rechigne à faire son travail

    Bref, on a deux causes différentes, qui ont pourtant sensiblement le même effet (l'éditeur de liens n'est pas contents), et qui provoquent chacune un message différent pour te permettre de savoir pourquoi l'éditeur de liens n'est pas content
    [PS]
    [1]J'ai pris quelques raccourcis faciles pour te permettre de comprendre l'idée... en réalité, c'est sans doute un peu plus compliqué que cela
    [2]En français, on parle de bibliothèque, et non de librairie
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre émérite
    Avatar de D[r]eadLock
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    504
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 504
    Par défaut
    [un peu HS (mais néanmoins intéressant??)] peut-être que boost utilise des pragmas pour forcer le linker à reconnaitre la bibliothèque ??

  4. #4
    Nouveau membre du Club
    Inscrit en
    Mars 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2007
    Messages : 5
    Par défaut
    Pas du tout HS du tout, en fait c'est d'ailleurs la solution à mon problème.
    Après avoir fouillé autour de cette histoire de pragma, je suis tombé sur ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #pragma comment(lib,"libname.lib") //example for the file libname.h
    Thank you much !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment lier les sources et la Javadoc au JDK ou à une lib ?
    Par Beginner. dans le forum Eclipse Java
    Réponses: 5
    Dernier message: 23/12/2014, 02h23
  2. Réponses: 2
    Dernier message: 28/03/2013, 16h40
  3. Maven + Eclipse : Lier les sources à une librairie
    Par Methode dans le forum Maven
    Réponses: 1
    Dernier message: 10/02/2009, 11h45
  4. Réponses: 2
    Dernier message: 26/05/2008, 13h50
  5. Réponses: 3
    Dernier message: 18/03/2008, 21h55

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