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 :

exporter un Projet C++ dans une librairie


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 20
    Points : 15
    Points
    15
    Par défaut exporter un Projet C++ dans une librairie
    Bonjour à tous,

    Je souhaite créer un projet C++, et pouvoir le distribuer en tant que librairie. Le problème est qu'il est plutôt facile de créer des librairies C, mais avec le paradigme objet en C++, cela devient tout de suite une autre histoire.

    En cherchant sur internet, je suis tomber sur ce lien qui donne quelques explications. Si j'ai bien compris, le problème pour exporter une classe est que le nommage des fonctions et la construction des classes au niveau mémoire n'est pas standardiser. Ce qui fait que d'un compilateur à l'autre voir même d'une version à l'autre, il peut y avoir des problèmes de compatibilité (ABI).

    Le lien propose 3 façons de faire :
    • Utiliser des méthodes C et des structures
    • Utiliser le même compilateur pour la librairie et le client
    • Enfin, créer une methode pour instancier ou détruire l'objet


    Mais quand je regarde des projets déjà existant tel que Qt, on peut instancier naturellement des classes, en utilisant un compilateur différent.

    Je souhaiterais donc savoir comment pourrais je créer une librairie C++, et pouvoir exporter mes classes, en gardant bien entendu tout le paradigme objet (héritage, polymorphisme, ...).

    Je vous remercie pour votre aide !!!

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    En fait, Qt nécessite d'être compilé pour chaque compilateur spécifique, et il est largement préférable d'éviter d'utiliser une des dll compilée avec un compilateur particulier (ou une version particulière de compilateur) si ce n'est pas le compilateur que tu utilises.

    Tu pourras d'ailleurs remarquer que, sur la page de téléchargement de Qt, on te propose différentes versions en fonction du compilateur que tu prévois d'utilier

    Ceci dit, si cela entre dans la "philosophie" de ce que tu veux faire, l'un des moyens les plus simples pour t'assurer que la dll sera compilée avec le même compilateur que celui de l'utilisateur est encore... de lui fournir simplement les sources et le moyen de les compiler par lui-même
    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 à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 20
    Points : 15
    Points
    15
    Par défaut
    Bonjour koala01,

    et merci de ta réponse. Le projet que je souhaite faire à pour but d’être Open Source. Donc pour la recompilation de la librairie, il n'y aura aucun problème. Le projet à également pour vocation d’être multiplateforme. Il sera donc compilé pour chacun des systèmes.

    Mais la ou je pense avoir un problème, c'est lorsque la librairie est partagée par plusieurs applications. Il faudra alors s'assurer que les applications qui le partage soient compilées avec le même compilateur. Il devient donc déconseillé d'installer une librairie dans le système, car il faudrait s'assurer que chaque application qui l'utilise soit compiler avec le même compilateur.

    Ce que je cherche avant tout, ce sont les bonnes méthodes pour commencer mon développement. Je ne voudrais pas revenir en arrière en milieu de projet parce que la réflexion de départs ne suivait pas ce que j'avais l'intention de faire.

    bonjour à tous,

    Je pense creer ma librairie en C, avec des appels standards, puis créer un wrapper pour C++.
    C'est peut être un peu lourd, mais je pense que sa peut fonctionner. Par exemple la SDL est en C, donc plus de problème de compatibilité entre compilateurs.

    Est ce une bêtise ? ou est ce une bonne initiative. Bien entendu, ça me donne bien évidemment plus de travail ...

  4. #4
    Membre averti Avatar de Nogane
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    241
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 241
    Points : 323
    Points
    323
    Par défaut
    Bonjour,
    J'aurais plus eu tendance a faire le contraire, comme dans la lib ODE par exemple, faire mon code en C++, et créer un wrapper C. Comme ça je garde la puissance du C++ pour créer ma lib, et la portabilité du C pour mon interface DLL.
    Remarquez, une alternative serait d'utiliser SWIG pour wrapper votre interface C++ dans tout plein d'autre langage, indépendamment du compilateur utilisé.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 20
    Points : 15
    Points
    15
    Par défaut
    Bonjour Nogane,

    Je ne connaissais pas SWIG, mais ça à l'air super puissant.
    Mais le problème que j'ai, c'est justement de créer une librairie C++. Je voudrais pouvoir faire une librairie (DLL ou SO) avec des objets (donc des classes), et qu'elles soient utilisable pour les compilateur C++ (en fournissant bien entendu la librairie et le header).

    Admettons que la librairie soit compiler avec GCC et le programme avec VC++, d’après ce que j'ai lu, il pourrait y avoir des problèmes de compatibilité. Car le nommage des méthodes et l'ABI diffèrent.

    Enfin j’avoue être un peu perdu . Mon but est juste de pouvoir créer des classes et les exporter dans une librairie. Ce qui permettrai a d'autre projet de les utiliser. Je ne veux absolument pas perdre mon paradigme objet si je développe en C++. Sinon je me tournerais vers le C.

  6. #6
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Ce qu'il faut comprendre, c'est que si tu fournis ta bibliothèque en open source, et, surtout, que tu code de manière portable, tu n'auras de toutes façons aucun problème...

    Du moment que tu fournis déjà le nécessaire pour arriver à le compiler sur un système (auto-tools ou CMake sous linux, CMake ou .vcproj voir projet "code::blocks" sous windows), tu pourrais meme très rapidement trouver des gens qui apporteront "leur pierre à l'édifice" en fournissant d'autres système (basés sur auto-tools, par exemple) et qui seront enchantés de constater que leur travail est intégré au projet (c'est ca aussi, l'open source )

    Tout ce à quoi TU as à veiller, c'est de coder de manière portable : si tu as l'occasion de compiler ta dll avec Gcc et VC++, par exemple, quel que soit l'edi ou le système de compilation envisagé, tu pourras déjà savoir qu'elle ne nécessitera pas *trop* d'adaptation pour les autres systèmes

    De toutes facons, les développeurs C++ ont suffisamment l'habitude (entre autres grace à boost ou à Qt) de travailler avec des dll "système dépendantes"

    Alors, bien sur, le "must" serait, effectivement, de créer un "wrapper" qui permet d'utiliser l'ABI C, qui est bien plus clairement définie, mais cela peut, malgré tout, se trouver très bas dans ta "todo list"
    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

  7. #7
    Membre averti Avatar de Nogane
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    241
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 241
    Points : 323
    Points
    323
    Par défaut
    Ah ben si c'est pour du C++ vers C++... SWIG n'est pas fait pour ça(a ma connaissance).

    Non la vraiment, je crois que la seul solution qui n’oblige pas a faire du C, c'est de faire un cmake(ou équivalent), et de fournir les sources pour permettre de compiler avec chaque compilateurs désiré.

    Dans le pire des cas(parce que je conseillerais quand même l'approche cmake), on peut faire une interface C a un lib orienté objet. Regarde l'interface de ODE par exemple.

    On se retrouve avec des fonctions comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    dWorldID dWorldCreate();
    void dWorldDestroy (dWorldID);
    void dWorldSetGravity (dWorldID, dReal x, dReal y, dReal z);
    void dWorldGetGravity (dWorldID, dVector3 gravity);
    void dWorldSetERP (dWorldID, dReal erp);
    dReal dWorldGetERP (dWorldID);
    Ou dWorldID n'est certainement qu'un typedef de pointeur. Il est évident que chaque fonctions appel une méthode membre par derrière... ni vu ni connue.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 20
    Points : 15
    Points
    15
    Par défaut
    Je vous remercie tous pour votre contribution

    Je vais pouvoir commencer mon projet sans m’inquiéter à présent .

    Afin de présenter mon projet très succinctement, je vais créer un petit moteur 3D objet utilisant les API d'OpenGL. Le but étant juste de fournir des objets simple afin de rendre une scene (avec lumière, ombre, ...).
    Je sais qu'il existe des projets tel que Ogre3D qui existe déjà, mais le but est pour moi, d'abord pédagogique

    Je marque le post comme résolue, et vous remercie encore !!!

  9. #9
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Si tel est ton désir, je t'encourage à regarder le projet autoscene.
    C'est un projet que j'avais codé il y a deux ans, dans lequel je réalise une surcouche à opengl.

    Cela peut te donner des idées, voire même, l'envie de reprendre le projet.
    Avec un peu de chance, je m'y remettrai
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

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

Discussions similaires

  1. [MySQL] librairie - exporter base de donnees dans une feuille excel ?
    Par juju03 dans le forum PHP & Base de données
    Réponses: 28
    Dernier message: 30/07/2008, 14h45
  2. exporter un projet eclipse dans Tomcat
    Par horkets dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 25/05/2007, 12h53
  3. [Free Pascal] Récupérer le nom d'une fonction dans une librairie
    Par franck.thibault dans le forum Free Pascal
    Réponses: 1
    Dernier message: 17/05/2007, 22h08
  4. Réponses: 5
    Dernier message: 27/08/2006, 14h24
  5. Réponses: 5
    Dernier message: 29/09/2005, 13h55

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