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 :

Faciliter l'intégration d'une bibliothèque


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Par défaut Faciliter l'intégration d'une bibliothèque
    Bonjour,

    j'ai implémenté une bibliothèque mylib que j'aimerais diffuser. Cette bibliothèque effectue plusieurs tâches également réalisées par une autre bibliothèque otherlib déjà disponible et dont je ne suis pas l'auteur. Supposons qu'un développeur souhaite intégrer ces deux bibliothèques dans un code en laissant libre choix à ses utilisateurs d'utiliser mylib ou otherlib. Pour gérer ce genre de choses, j'ai l'habitude de voir des instructions pré-processorales du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #ifdef MYLIB 
    // définitions à partir de mylib
    #else
    #ifdef OTHERLIB
    // définitions à partir de otherlib
    #endif
    #endif
    J'ai deux questions à ce sujet :
    1. existe-t-il un mécanisme équivalent correspondant mieux à la philosophie C++?
    2. si la réponse à 1. est négative, où définir MYLIB dans ma bibliothèque? En forçant l'inclusion d'un fichier d'en-tête mylib.h ou peut-on s'en passer?

    Merci beaucoup!

  2. #2
    Membre Expert Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Par défaut
    Citation Envoyé par Aleph69 Voir le message
    1. existe-t-il un mécanisme équivalent correspondant mieux à la philosophie C++?
    Oui, les namespace http://cpp.developpez.com/faq/cpp/?page=namespace
    Chaque bibliothèque écrit ces fonctions dans son propre namespace.
    L'utilisateur peut faire un #include des deux bibliothèques dans un même fichier et utiliser les fonctions de cette façon lib0::fct() lib1::fct()
    Il peut aussi faire un using namespace d'une des bibliothèques (à utiliser de façon limitée) comme dans using namespace std;.

  3. #3
    Membre Expert
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Par défaut
    Oui, bien sûr j'utilise déjà des espaces de noms. J'ai peut-être mal formulé mon problème. Je ne cherche pas à contourner un éventuel conflit entre les deux bibliothèques. Je cherche à faciliter l'intégration de ma bibliothèque au sens où le code du développeur en question doit pouvoir compiler même si son utilisateur ne possède pas ma bibliothèque.

  4. #4
    Membre Expert Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Par défaut
    Citation Envoyé par Aleph69 Voir le message
    Je cherche à faciliter l'intégration de ma bibliothèque au sens où le code du développeur en question doit pouvoir compiler même si son utilisateur ne possède pas ma bibliothèque.
    Pour facilier l'intégration, tu peux mettre la bibliothèque directement dans le projet voire en static. Ou si possible tu écris une bibliothèque uniquement avec des fichiers d'entête (header-only).

    En tout cas, ce n'est pas à l'auteur de la bibliotèque de s'occuper de ça. Si un utilisateur veut utiliser, ta bibliothèque il le fera surtout si elle est facile d'intégration.

    Je ne connais pas de mécanisme plus C++ que les #if defined(VAR) pour gérer les #include. Tu peux aussi voir du coter du Makefile ou de CMake pour compiler le bon fichier au lieu d'un autre mais je ne suis pas sûr que ce soit plus propre.

    En C++, on préférera : (^^)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #if defined(MY_LIB)
    // ...
    #endif

  5. #5
    Membre Expert
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Par défaut
    Citation Envoyé par Ehonn Voir le message
    En tout cas, ce n'est pas à l'auteur de la bibliotèque de s'occuper de ça.
    Je ne vois pas du tout ce qui te permet d'affirmer cela mais, pour toutes celles que j'ai été amené à utiliser, les auteurs s'en sont occupés. Je crois qu'il y a un malentendu sur la problématique.

    Citation Envoyé par Ehonn Voir le message
    Je ne connais pas de mécanisme plus C++ que les #if defined(VAR) pour gérer les #include.
    Je ne cherche pas du tout à faire cela! Oublions le C++ un moment. Imaginons que le développeur en question ait besoin d'une fonction openfile ouvrant un fichier. Il peut implémenter sa propre fonction myopenfile ou appeler la fonction libopenfile1 d'une bibliothèque lib1 gratuite ou la fonction libopenfile2 d'une bibliothèque lib2 payante, ces deux dernières fonctions étant bien plus performantes, la payante l'étant encore plus. Un utilisateur n'ayant que des petits fichiers à traiter et en très petit nombre se contentera de myopenfile. Sinon, il choisira d'utiliser libopenfile1 ou bien libopenfile2 s'il en a les moyens. Pour gérer les trois possibilités, le développeur va en fait définir une fonction openfile qui correspondra à myopenfile, libopenfile1 ou libopenfile2 selon que l'une des deux bibliothèques est disponible ou pas. Pour cela, il doit pouvoir détecter la présence ou l'absence des bibliothèques et compiler un code différent en fonction de cela. Il paraît donc naturel de faire appel au préprocesseur.

    Ma question est de savoir comment faire en sorte que la présence ou l'absence de ma bibliothèque soit détectable tout en respectant la philosophie C++.

  6. #6
    Membre Expert Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Par défaut
    J'avais ça dans un projet. 3 + 1 façons de créer des threads, 3 façons de faire une inversion de matrice, et une fonction optionnelle.
    La détection des bibliothèques se faisait avec CMake; et si plusieurs choix étaient possibles, l'utilisateur pouvait choisir la façon de faire avec un paramètre de la ligne de commande. Le code correspondant aux façons possibles étaient "activé" ou "désactivé" avec des #if defined(VAR), avec VAR donné, ou pas, par CMake.

    Le problème était que le CmakeLists faisait 500 lignes...
    J'ai réduit ça à environ 50 lignes en générant plusieurs exécutables. Mais j'ai toujours les #if defined(VAR) lorsqu'il est plus simple de ne pas séparer le code en plusieurs fichiers.

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

Discussions similaires

  1. [Débutant] problème d'intégration d'une bibliothèque sous Visual studio 2010
    Par IsaAdA dans le forum Visual Studio
    Réponses: 5
    Dernier message: 25/08/2013, 20h18
  2. Holla : une bibliothèque JavaScript facilitant l'utilisation des API WebRTC
    Par FirePrawn dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 21/02/2013, 10h03
  3. Réponses: 4
    Dernier message: 09/01/2009, 16h22
  4. Installation d'une bibliothèque
    Par Empty_body dans le forum JBuilder
    Réponses: 3
    Dernier message: 09/02/2006, 19h43
  5. Réponses: 19
    Dernier message: 26/04/2004, 08h54

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