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

Bibliothèques C++ Discussion :

.so/.dll .a/.lib et dllexport


Sujet :

Bibliothèques C++

  1. #1
    Membre éclairé
    Avatar de Floréal
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    456
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 456
    Points : 849
    Points
    849
    Par défaut .so/.dll .a/.lib et dllexport
    Bonjour,
    Je développe actuellement une librairie open source/multi-plateforme, et je suis un peu embêté, car je voudrais pouvoir offrir à l'utilisateur (développeur) le choix de la lier dynamiquement ou statiquement à ses programmes.
    Même si le projet n'existe pour l'instant que sous forme de diagramme UML, je préfère me poser la question dès maintenant pour pas être bloqué plus tard.
    Mon problème se pose au niveau des macros pour indiquer au compilateur que mes classes doivent être utilisées dans une .dll (ou .so). Pour cela je passerai un Flag au pré-processeur (avec -DDYNAMIC pour gcc par exemple).
    En outre j'ai également fouillé dans les headers de Qt (que j'avais sous la main) et je suis tombé sur ce code ci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #ifndef Q_DECL_EXPORT
    #  ifdef OS_WIN
    #    define Q_DECL_EXPORT __declspec(dllexport)
    #  elif defined(QT_VISIBILITY_AVAILABLE)
    #    define Q_DECL_EXPORT __attribute__((visibility("default")))
    #  endif
    #  ifndef Q_DECL_EXPORT
    #    define Q_DECL_EXPORT
    #  endif
    #endif
    #ifndef Q_DECL_IMPORT
    #  if defined(Q_OS_WIN)
    #    define Q_DECL_IMPORT __declspec(dllimport)
    #  else
    #    define Q_DECL_IMPORT
    #  endif
    #endif
    Ce qui donnerait quelque chose comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    #ifndef DECL_EXPORT
    #  ifdef OS_WIN
    #    define DECL_EXPORT __declspec(dllexport)
    #  ifndef Q_DECL_EXPORT
    #    define Q_DECL_EXPORT
    #  endif
    #endif
    #ifndef DECL_IMPORT
    #  if defined(OS_WIN)
    #    define DECL_IMPORT __declspec(dllimport)
    #  else
    #    define DECL_IMPORT
    #  endif
    #endif
    Où OS_WIN sera défini à certaines conditions (C-A-D si la plateforme cible est de type windows 16, 32, 64, embarqué...)
    Puis, selon que l'on veuille compiler ou utiliser ma librarie ou l'utiliser dans un projet, j'ajouterai ce morceau de code ci (ce que fait QtCreator en fait):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #ifndef BUILD_LIB
    #  LIB_DECL = DECL_EXPORT
    #else
    #  LIB_DECL = DECL_IMPORT
    #endif
    Enfin les déclaration de mes classes se feraient de cette manière:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class LIB_DECL Toto
    {
      ...
    };
    Ceci est il suffisant? Que me conseilleriez vous? Avez vous des liens vers des Tutos à me suggérer (j'ai lu celui-ci mais je ne pense pas qu'il réponde à mon problème)? Des snippets à me proposer?
    Je vous remercie par avance.
    Ancien membre du projet "Le Dernier Âge".

  2. #2
    screetch
    Invité(e)
    Par défaut
    il faut sans doute que tu utilises le nom de ta bibliotheque
    BUILD_LIB n'est pas assez précis, mets le vrai nom de ta lib
    __declspec(dllexport) ne doit etre utilisé que si tu construits une dll, or tu ne testes pas cela, ca veut dire que meme dans un .lib tes fonctions seront __declspec(dllexport)
    si tu lies ton exe a cette lib, ton exe va a son tour exporter ces fonctions!!

  3. #3
    screetch
    Invité(e)
    Par défaut
    si ta lib s'appelle "malib" :
    tu dois la construire en utilisant -DBUILDING_MALIB
    si ta lib est construite comme dll : -DMALIB_DLL

    ensuite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #ifdef _WIN32
    # ifdef MALIB_DLL
    #  ifdef BUILDING_MALIB
    #   define MALIB_DECL __declspec(dllexport)
    #  else
    #   define MALIB_DECL __declspec(dllimport)
    #  endif
    # else
    #  define MALIB_DECL
    # endif
    #else
    # define MALIB_DECL
    #endif
    en gros c'est comme le tien, mais avec le test pour une DLL et des macros nommées de manière plus unique

  4. #4
    Membre éclairé
    Avatar de Floréal
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    456
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 456
    Points : 849
    Points
    849
    Par défaut
    Je te remercie, je vais faire mes tests ce WE (quand j'aurai un pc sous windows sous la main) et je te tiendrai au jus.
    Ce serait peut être bien d'ajouter ce sujet à la FAQ C++, car j'imagine que le problème est récurent.
    Ancien membre du projet "Le Dernier Âge".

  5. #5
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    J'utilise une autre méthode... qui prend avantage des headers précompilés...

    Dans tous mes sources j'ai donc (en première ligne):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #include "precompiled.h"
    Dans tous mes headers j'ai:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #include "MaLibNameDefines.h"
    Dans "precompiled.h" (le header précompilé, qui n'est inclut que lorsqu'on compile la librairie)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #include "CompilerDefines.h"
    #ifdef MALIBNAME_STATIC
    # define  MALIBNAME_API
    #else
    # define  MALIBNAME_API    COMPILER_EXPORT
    #endif
    Dans "MaLibNameDefines.h":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #include "CompilerDefines.h"
    #ifndef MALIBNAME_API
    # ifdef MALIBNAME_STATIC
    #  define MALIBNAME_API
    # else
    #  define MALIBNAME_API    COMPILER_IMPORT
    # endif
    #endif

    Dans CompilerDefines.h je fais les defines qui vont bien pour le bon compilo/os/...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #ifdef _MSCVER
    #define  COMPILER_EXPORT    __declspec(dllexport)
    #define  COMPILER_IMPORT    __declspec(dllimport)
    ...
    #endif
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  6. #6
    Membre éclairé
    Avatar de Floréal
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    456
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 456
    Points : 849
    Points
    849
    Par défaut
    Oui, c'est aussi une solution qui me semble plutôt intéressante, ça me fait penser un petit peut aux config.h qu'on obtient avec CMake ou Autoconf/Automake, adapté à l'environnement pour lequel on a compilé la librairie.
    Panses tu que cela puisse-t'être plus simplement géré avec ce genre d'outil, plutôt que de prévoir tous les cas de figure dans mon code source, dans la mesure où ce genre d'outil fonctionnent et donc connaissent plus de compilateurs que moi?
    Ancien membre du projet "Le Dernier Âge".

Discussions similaires

  1. DLL include LIB VC++
    Par Saris dans le forum Bibliothèques
    Réponses: 1
    Dernier message: 10/05/2007, 17h32
  2. dll link lib LNK1104
    Par samtheh dans le forum C++
    Réponses: 2
    Dernier message: 18/12/2006, 21h58
  3. Réponses: 2
    Dernier message: 19/09/2006, 19h06
  4. DLL ou LIB de php ?
    Par wolfjeremy dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 17/07/2006, 17h01
  5. Using DLL Import lib in C code with GCC
    Par Hibou57 dans le forum C
    Réponses: 7
    Dernier message: 23/03/2006, 22h38

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