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 :

[minGW] creér un dll qui contient une lib statique


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 55
    Points : 27
    Points
    27
    Par défaut [minGW] creér un dll qui contient une lib statique
    Bonjour, je développe sous winXp-minGw.

    Je ne suis pas un expert et je sais tout juste créer une lib statique ou dynamique.

    Je voudrais créer une dll à partir d'un source que j'ai écris moi même et qui fait un appel aux fonctions d'une librairie statique déjà compilée... et là je patauge un peu.

    Voilà comment je compile mon projet:
    g++ -c -DBUILD_DLL monSrc.cpp
    g++ -shared -L. -o maLibDyn.dll monSrc.o -Wl,--out-implib,libtstdll.a -lLalibEnPLus.lib
    La compilation se passe bien mais l'édition de lien retourne une liste d'erreurs undefined reference sur les méthodes contenues dans LaLibEnPlus.lib

    Comment faut il s'y prendre? Est ce qu'il faut préalablement modifier la librairie statique pour qu'elle puisse être intégrée à la dll?

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 55
    Points : 27
    Points
    27
    Par défaut
    Je me suis un peu emmêlé les pinceaux mais en faisant les choses dans l'ordre, ça va mieux.

    Ci dessous la version détaillée, ça peut servir d'exemple pour compiler une lib statique et une lib dynamique

    - Je crée une librairie statique qui ne contient qu'une fonction hello() qui affiche ... hello

    -Je crée une librairie dynamique qui ne contient qu'une fonction direHello() et qui appelle la fonction hello de ma lib statique

    -Je crée un main qui appelle la fonction direHello de ma librairie dynamique.

    C'est parti:

    La lib statique :

    hello.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #include <iostream>
     
    int hello (void);
     
    int hello(void)
        {
        std::cout << "hello world!";
        return (0);
        }
    je compile avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    g++ -c hello.cpp
    ar -rc libhello.a hello.o
    La lib dynamique:

    direHello.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #ifdef BUILD_DLL
    // the dll exports
    #define EXPORT __declspec(dllexport)
    #else
    // the exe imports
    #define EXPORT __declspec(dllimport)
    #endif
     
    EXPORT void direHello(void);
    direHello.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #include "direHello.h"
     
    #include "hello.h"
     
    EXPORT void direHello(void)
        {
        hello();
        }
    Je la compile avec ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    g++ -c -DBUILD_DLL direHello.cpp
    g++ -shared -o direHello.dll -Wl,--out-implib,libdireHello.a direHello.o -lhello -L.
    Je finis avec mon petit main:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #include "direHello.h"
     
    int main(void)
        {
        direHello();
        return (0);
        }
    Et je compile le total de cette façon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    g++ -c main.cpp
    g++ -o monPrg.exe main.o -ldireHello -L.
    et voilà!

  3. #3
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Pas mal, mais tu auras des problèmes si tu veux utiliser direHello.dll depuis une autre DLL.
    Pour corriger cela, tu dois:
    • Remplacer BUILD_DLL par BUILD_DIREHELLO_DLL (y compris dans les options du projet)
    • Remplacer EXPORT par DIREHELLO_API

    Ainsi, tu n'auras pas de conflit.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 23
    Points : 13
    Points
    13
    Par défaut
    Bonjour,

    j'ai exactement le même soucis, sauf qu'il n'apparait qu'avec mingw et non avec gcc (sous linux).

    sous linux avec g++:
    g++ -o plugin.dso -shared -Wl,-soname,plugin plugin.o
    et ça fonctionne sans problème.

    sous linux avec mingw pour windows (cross compilation):
    i686-mingw32-g++ -shared -o plugin.dso plugin.o
    et j'ai des undefined references. ces ref manquantes sont dans l'executable qui charge le plugin.

    Savez-vous s'il existe une solution pour que mingw ai le même comportement que gcc ?
    Car je ne trouve pas très propre de créer une lib.a comportant les ref de l'executable principal pour l'importer dans la DLL lors de la compilation.

    merci

    Xavier

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Tu veux dire que ta DLL référence l'exécutable ?

    Impossible à ma connaissance sous Windows (c'est déjà assez compliqué de faire deux DLLs qui se référencent l'une l'autre): Tu dois faire autrement, par exemple avec des callback.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    screetch
    Invité(e)
    Par défaut
    non pas du tout c'est possible.

    g++ peut linker avec tous les executables PE et elf de windows et linux, et MSVC peut generer des .lib d'import a partir d'un exe, je m'en sers pour les plugins dans la version statique; ainsi, je n'ai qu'un exe et il fournit des methodes pour les plugins. dans le cas dynamique, l'exe est seulement un main qui appelle tout de suite des dll et le plugin est lié aux DLL

    par contre c'est assez complexe :

    - tu dois construire des .lib et l'exe en mettant quand meme des __declspec(dllexport), meme si tu ne compiles que des .lib
    - tu dois les lier a l'executable
    - tu dois lier ton plugin a l'executable

    la difference entre windows et linux, c'est que lorsqu'on utilise dlopen sous linux les fonctions de l'exe sont automatiquement ajoutées a l'import des bibliotheques
    et de plus, sous linux ont peut garder des references indéfinies jusqu'au load de la bibliotheque, qui doit alors realiser le linking

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 23
    Points : 13
    Points
    13
    Par défaut
    merci pour vos réponses.

    j'ai pour le moment résolu le problème en créant une archive lib.a de mon executable ainsi que pour les différentes bibliotèques que je lie à ma DLL . L'ordre dans lequel on donne les bibliotèques au linker est très important, sinon "undef reference". Je ne trouve pas ça très propre, mais bon on fera avec pour le moment. Puis quand mes connaissances en prog sous windows seront meilleurs j'essaierai ta solution.

Discussions similaires

  1. Réponses: 1
    Dernier message: 02/05/2013, 00h35
  2. Flash CS3: créer un symbole qui contient une image
    Par caema dans le forum EDI/Outils
    Réponses: 0
    Dernier message: 25/02/2012, 20h31
  3. Créer une feuille qui contient une seule page seulement
    Par k-eisti dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 14/05/2007, 17h38
  4. suppression dans une table qui contient une clé etrangère
    Par zana74 dans le forum Décisions SGBD
    Réponses: 13
    Dernier message: 08/08/2006, 10h58
  5. [VS2005][C#] Sélection Item qui contient une string
    Par olivier_23 dans le forum Windows Forms
    Réponses: 10
    Dernier message: 26/07/2006, 10h56

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