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 :

[MSVC8] Linker des librairies statique dans une librairie statique


Sujet :

C++

  1. #1
    Membre confirmé Avatar de 5:35pm
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2006
    Messages : 201
    Par défaut [MSVC8] Linker des librairies statique dans une librairie statique
    Bonjour,

    Je travaille sur une librairie statique, qui depend elle meme d'autres librairies statique.

    L'executable utilisant ma librairie foire au linkage, car elle reclame les librairies dont ma librairie est dependante.

    Je cherche donc a inclure ses dependance de maniere a ce que l'executable n'aie besoin que de ma librairie.
    J'ai essaye de changer les options lors de la compilation de ma librairie, mais rien n'y fait...

    Existe t-il une solution a ca, ou devrais-je me resoudre a faire un dll ?

    merci =)

  2. #2
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Ce n'est pas possible, il me semble (mais je peux me tromper ). Tu dois inclure à la fin la totalité des bibliothèques. Un des avantages des bibliothèques statiques est de ne pas nécessiter une édition des liens complètes, contrairement aux bibliothèques dynamiques.

  3. #3
    Membre confirmé Avatar de 5:35pm
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2006
    Messages : 201
    Par défaut
    merci pour cette reponse rapide

    mais a voir la reponse je suis un peu deg lol

  4. #4
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Salut,

    Tu vas dans les propriétés du projet et dans Librarian tu ajoutes les .lib dans Additional Dependencies (la 2e ligne).

    MAT.

  5. #5
    Membre confirmé Avatar de babar63
    Homme Profil pro
    Développeur jeux vidéos/3d Temps réel
    Inscrit en
    Septembre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur jeux vidéos/3d Temps réel

    Informations forums :
    Inscription : Septembre 2005
    Messages : 241
    Par défaut
    Citation Envoyé par Matthieu Brucher Voir le message
    Ce n'est pas possible, il me semble (mais je peux me tromper ). Tu dois inclure à la fin la totalité des bibliothèques. Un des avantages des bibliothèques statiques est de ne pas nécessiter une édition des liens complètes, contrairement aux bibliothèques dynamiques.
    Si la bibliothèque statique est liée directement lors de la compilation d'une autre bibliothèque(statique ou dynamique), pourquoi il faudrait inclure la première lib dans le projet utilisant la deuxième...? Pour moi, c'est justement l'avantage d'une lib statique, je me trompe?

    Ce n'est pas justement la librairie dynamique qui ne nécessite pas une édition des liens complètes... ...

  6. #6
    Membre confirmé Avatar de 5:35pm
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2006
    Messages : 201
    Par défaut
    Citation Envoyé par Mat007 Voir le message
    Salut,

    Tu vas dans les propriétés du projet et dans Librarian tu ajoutes les .lib dans Additional Dependencies (la 2e ligne).

    MAT.
    c'est bien ce que je fais
    J'ai aussi mis "Link Library dependencies" a "yes"...

    Si la bibliothèque statique est liée directement lors de la compilation d'une autre bibliothèque(statique ou dynamique), pourquoi il faudrait inclure la première lib dans le projet utilisant la deuxième...? Pour moi, c'est justement l'avantage d'une lib statique, je me trompe?
    eh bien cette lib est un framework qui encapsule pas mal de choses, et ca m'embete de specifier toutes ces dependances dans l'appli, ca fait assez bordelique =)

  7. #7
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par Matthieu Brucher Voir le message
    Ce n'est pas possible, il me semble (mais je peux me tromper ). Tu dois inclure à la fin la totalité des bibliothèques. Un des avantages des bibliothèques statiques est de ne pas nécessiter une édition des liens complètes, contrairement aux bibliothèques dynamiques.
    Je confirme

    Le link statique se finalise lors de la création de l'exécutable donc il faut la liste des toutes les librairies statiques (même celles qui dépendent/sont utilisées par une autre librairie intermédiaire)

    Par contre, je ne sais pas pourquoi il faut ajouter les librairies statiques lors de la création des librairies statiques intermédiaires. Tu as essayé de créer cette librairie intermédiaire sans lier avec les autres librairies ?
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  8. #8
    Membre confirmé Avatar de 5:35pm
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2006
    Messages : 201
    Par défaut
    mmm un detail que j'aurais du preciser, j'ai pas mal de warning a la compilation de la librairie:

    winmm.lib(WINMM.dll) : warning LNK4221: no public symbols found; archive member will be inaccessible

    ca le fait pour chaque librairie tierce...

    EDIT

    selon msdn: http://support.microsoft.com/kb/815773:

    This article discusses the Linker Tools Warning LNK4221 message. This warning occurs when you try to add resources to a static library. The linker tries to add resources in a publicly accessible way. However, the linker fails and you receive the following warning message:
    warning LNK4221: no public symbols found; archive member will be inaccessible
    An object file was added to an archive library that has no public symbols. The object is not accessible by using subsequent linker commands.
    et ce lien dit :

    Linker Tools Warning LNK4221:
    A .obj file with no public symbols was added to a library. The symbols in the object will not be accessible in subsequent linker operations that include the .lib.

    To resolve this warning, do not link a .obj file with no public symbols into a library.
    donc en gros il faut des symboles public, et je ne sais pas comment ca marche... ou alors c'est vraiment pas possible...

  9. #9
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Citation Envoyé par 5:35pm Voir le message
    c'est bien ce que je fais
    Et bien dans ce cas tu n'as pas besoin des .lib que tu listes dans cette case lors de l'édition des liens finale, ils sont inclus dans ton .lib intermédiaire. Tu peux le vérifier en observant la différence de taille du .lib et/ou avec un dumpbin /all truc.lib | grep ton_symbol.

    Par contre oui c'est quand même très risqué : si le client utilise par ailleurs les mêmes bibliothèques dans des versions différentes, ça va faire n'importe quoi au final.

    Citation Envoyé par 5:35pm Voir le message
    J'ai aussi mis "Link Library dependencies" a "yes"...
    Non ça n'a rien à voir ça par contre.

    MAT.

  10. #10
    Membre confirmé Avatar de babar63
    Homme Profil pro
    Développeur jeux vidéos/3d Temps réel
    Inscrit en
    Septembre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur jeux vidéos/3d Temps réel

    Informations forums :
    Inscription : Septembre 2005
    Messages : 241
    Par défaut
    Citation Envoyé par ram_0000
    Je confirme

    Le link statique se finalise lors de la création de l'exécutable donc il faut la liste des toutes les librairies statiques (même celles qui dépendent/sont utilisées par une autre librairie intermédiaire)

    Par contre, je ne sais pas pourquoi il faut ajouter les librairies statiques lors de la création des librairies statiques intermédiaires. Tu as essayé de créer cette librairie intermédiaire sans lier avec les autres librairies ?
    Le code d'une librairie statique est bien lié à la compilation, donc si on l'utilise dans un projet on doit linker la librairie. De même, si une librairie intermédiaire est déjà linkée avec une autre alors ce n'est plus la peine de la linker pour les futurs projets, en clair, ce n'est pas obligatoire de linker une librairie si d'autre librairie linkée le font déjà. Voilà un exemple pour être plus claire :

    Premier projet : Librairie statique Lib1.lib, défini la classe MaClasse1(MaClasse1.h, MaClasse1.cpp)

    Deuxième projet : Librairie statique Lib2.lib linkée avec Lib1.lib, défini la classe MaClasse2(MaClasse2.h, MaClasse2.cpp)

    Exécutable : linké avec Lib2.lib, utilise MaClasse1 et MaClasse2...
    winmm.lib(WINMM.dll) : warning LNK4221: no public symbols found; archive member will be inaccessible
    Il me semble que ce warning signifie que tu inclue dans ta librairie une classe qui ne pourra être accédée de l'extérieur car tu n'a aucun symbole(constructeur, donnée, fonction) défini en public...

    Citation Envoyé par 5:35pm
    c'est bien ce que je fais
    Dans ce cas, quelle est l'erreur que tu obtiens...

  11. #11
    Membre confirmé Avatar de 5:35pm
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2006
    Messages : 201
    Par défaut
    Dans ce cas, quelle est l'erreur que tu obtiens...
    LINK : fatal error LNK1104: cannot open file 'xxxx.lib'

    ou xxxx est une lib utilise par ma propre librairie...

  12. #12
    Membre confirmé Avatar de babar63
    Homme Profil pro
    Développeur jeux vidéos/3d Temps réel
    Inscrit en
    Septembre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur jeux vidéos/3d Temps réel

    Informations forums :
    Inscription : Septembre 2005
    Messages : 241
    Par défaut
    Citation Envoyé par 5:35pm
    LINK : fatal error LNK1104: cannot open file 'xxxx.lib'
    C'est toi qui à créé cette lib? Si c'est le cas il se peut qu'il ne trouve pas ta librairie. En dessous de "dépendances supplémentaires" tu as normalement "répertoires de bibliothèques supplémentaires", commences par mettre le path absolu pour tester ça devrait fonctionner.
    Si ce n'est pas le cas peux tu donner le nom de la librairie?

  13. #13
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Citation Envoyé par babar63 Voir le message
    Le code d'une librairie statique est bien lié à la compilation, donc si on l'utilise dans un projet on doit linker la librairie. De même, si une librairie intermédiaire est déjà linkée avec une autre alors ce n'est plus la peine de la linker pour les futurs projets, en clair, ce n'est pas obligatoire de linker une librairie si d'autre librairie linkée le font déjà.
    Il n'y a pas de phase d'édition des liens quand on crée une bibliothèque statique, d'ailleurs dans la configuration du projet on trouve 'Librarian' (lib.exe) et non 'Linker' (link.exe).
    Il faut voir un .lib comme une sorte de collection de .obj, chaque .obj est mis dans le .lib créé par la bibliothèque statique du .vcproj auquel il appartient et le tout est assemblé tout à la fin lors de l'édition des liens de l'exécutable (ou de la bibliothèque dynamique).

    Il faut donc fournir tous les .obj lors de l'édition des liens pour faire l'exécutable, en général on fournit tous les .lib mais ce n'est pas obligé.
    En effet il est tout à fait possible de simplifier le nombre de .lib finaux que l'utilisateur devra manipuler. Il suffit de mettre mettre un ou plusieurs .lib "dans" un autre .lib en utilisant le procédé que j'ai décrit.
    Si on regarde la ligne de commande générée on voit que le .lib est tout bêtement sur la ligne de commande au même titre que les .obj : lib.exe accepte les .obj et les .lib (cf. http://msdn2.microsoft.com/en-us/lib...5t(VS.80).aspx dont "The files can be COFF object files, 32-bit OMF object files, or existing COFF libraries.").

    Citation Envoyé par 5:35pm Voir le message
    LINK : fatal error LNK1104: cannot open file 'xxxx.lib'
    Il ne faut pas mettre xxxx.lib dans la liste des "input" du "linker" de l'application finale puisque il est inclus dans ton .lib intermédiaire.

    MAT.

  14. #14
    Membre confirmé Avatar de babar63
    Homme Profil pro
    Développeur jeux vidéos/3d Temps réel
    Inscrit en
    Septembre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur jeux vidéos/3d Temps réel

    Informations forums :
    Inscription : Septembre 2005
    Messages : 241
    Par défaut
    Citation Envoyé par Mat007 Voir le message
    Il n'y a pas de phase d'édition des liens quand on crée une bibliothèque statique, d'ailleurs dans la configuration du projet on trouve 'Librarian' (lib.exe) et non 'Linker' (link.exe).
    Il faut voir un .lib comme une sorte de collection de .obj, chaque .obj est mis dans le .lib créé par la bibliothèque statique du .vcproj auquel il appartient et le tout est assemblé tout à la fin lors de l'édition des liens de l'exécutable (ou de la bibliothèque dynamique).

    Il faut donc fournir tous les .obj lors de l'édition des liens pour faire l'exécutable, en général on fournit tous les .lib mais ce n'est pas obligé.
    En effet il est tout à fait possible de simplifier le nombre de .lib finaux que l'utilisateur devra manipuler. Il suffit de mettre mettre un ou plusieurs .lib "dans" un autre .lib en utilisant le procédé que j'ai décrit.
    Si on regarde la ligne de commande générée on voit que le .lib est tout bêtement sur la ligne de commande au même titre que les .obj : lib.exe accepte les .obj et les .lib (cf. http://msdn2.microsoft.com/en-us/lib...5t(VS.80).aspx dont "The files can be COFF object files, 32-bit OMF object files, or existing COFF libraries.").
    Oui je n'entrais pas en contradiction avec ça ( enfin je crois, je me suis tellement mal exprimé que j'ai dû mal à me comprendre )


    Il ne faut pas mettre xxxx.lib dans la liste des "input" du "linker" de l'application finale puisque il est inclus dans ton .lib intermédiaire
    En effet c'est inutile mais je ne crois pas que ça génère une erreur... je me trompe?

  15. #15
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Citation Envoyé par babar63 Voir le message
    En effet c'est inutile mais je ne crois pas que ça génère une erreur... je me trompe?
    Si linker ne trouve pas un des fichiers il sort avec une erreur, qu'il en ait besoin pour des symboles ou pas (en fait il n'a pas encore essayé de lier) : essaye de rajouter pipo.lib à l'édition des liens pour voir.

    MAT.

  16. #16
    Membre confirmé Avatar de babar63
    Homme Profil pro
    Développeur jeux vidéos/3d Temps réel
    Inscrit en
    Septembre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur jeux vidéos/3d Temps réel

    Informations forums :
    Inscription : Septembre 2005
    Messages : 241
    Par défaut
    Ce n'est pas ce que je voulais dire, j'ai du mal à me faire comprendre en ce moment (on va dire que c'est la fatigue ) si je reprend mon exemple :
    Citation Envoyé par babar63 Voir le message
    Premier projet : Librairie statique Lib1.lib, défini la classe MaClasse1(MaClasse1.h, MaClasse1.cpp)

    Deuxième projet : Librairie statique Lib2.lib linkée avec Lib1.lib, défini la classe MaClasse2(MaClasse2.h, MaClasse2.cpp)

    Exécutable : linké avec Lib2.lib, utilise MaClasse1 et MaClasse2...
    Ce que je voulais dire c'est que si l'exécutable link aussi lib1.lib, bien que ce soit inutile ça ne génère pas d'erreur. Pour ce qui est de trouver la librairie c'est autre chose, c'est pour ça d'ailleurs que j'ai écrit plus loin :
    Citation Envoyé par babar63 Voir le message
    il se peut qu'il ne trouve pas ta librairie. En dessous de "dépendances supplémentaires" tu as normalement "répertoires de bibliothèques supplémentaires", commences par mettre le path absolu pour tester ça devrait fonctionner

  17. #17
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Citation Envoyé par babar63 Voir le message
    Ce que je voulais dire c'est que si l'exécutable link aussi lib1.lib, bien que ce soit inutile ça ne génère pas d'erreur.
    Ah oui pardon j'avais pas compris ça.
    Effectivement tu peux ajouter plein de .lib inutiles pour l'édition des liens, ça ralentira un (tout petit) peu mais ça ne fera en effet pas d'erreur.

    MAT.

  18. #18
    Membre très actif

    Homme Profil pro
    Serial Entrepreneur
    Inscrit en
    Mai 2006
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Serial Entrepreneur

    Informations forums :
    Inscription : Mai 2006
    Messages : 68
    Par défaut
    Bonjour,

    J'aimerais faire la même chose avec code::blocks, mais je ne trouve pas comment faire... Quelqu'un saurait-il m'aider ?

    Merci d'avance !

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Citation Envoyé par xurei Voir le message
    Bonjour,

    J'aimerais faire la même chose avec code::blocks, mais je ne trouve pas comment faire... Quelqu'un saurait-il m'aider ?

    Merci d'avance !
    1. Suivre le menu Projects-->build options
    2. Sélectionner sur le coté gauche la cible qui a besoin de la bibliothèque (tout le projet, debug, relase ou cible personnelle)
    3. choisir l'onglet linker settings
    4. ajouter la bibliothèque dans la liste de gauche
    5. (éventuellement rajouter le dossier dans lequel se trouve la bibliothèque dans l'onglet search directories, sous onglet linker)
    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

  20. #20
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    A ma connaissance ce n'est pas possible directement. Le seul moyen est de le faire à la main (les bibliothèques statiques ne sont que des archives de fichiers objets).

    Si tu es sous Linux, ou si tu possèdes un environnement Linux sous Windows (CYGWIN), tu peux utiliser cette commande pour ajouter le contenu de lib_src.a à lib_dest.a :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ar xv lib_src.a | cut -f3 -d ' ' | xargs ar rvs lib_dest.a

Discussions similaires

  1. JNI - Chargement d'une librairie 32bits dans une vm 64bits
    Par forthx dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 30/04/2012, 19h34
  2. Réponses: 4
    Dernier message: 24/08/2011, 18h23
  3. Réponses: 3
    Dernier message: 03/08/2008, 12h35
  4. appeler une librairie .so dans une classe
    Par tet.dum dans le forum Langage
    Réponses: 8
    Dernier message: 31/10/2006, 09h34
  5. Réponses: 2
    Dernier message: 02/05/2006, 14h34

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