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

MFC Discussion :

création d'une dll (classe c++)


Sujet :

MFC

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 14
    Points : 10
    Points
    10
    Par défaut création d'une dll (classe c++)
    Bonjour à tous,

    Alors voilà, j'ai un problème qui m'agasse depuis un petit bout de temps...
    J'ai du code c++ que je veux faire tourner sous linux, mac et win... je ne veux pas donner mon code, donc, je crée des librairies. Sous linux pas de problème, mais pour créer des dll qui fonctionnent correctement c'est la galère !
    voilà un exemple bidon de classe :


    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    //--------------------------------------------------------------------
    // Fichier .h
     
    #ifndef __TEST_TOOL_H__
    #define __TEST_TOOL_H__
     
    #include "StdAfx.h" // Modifié pour passer aussi sous linux
     
    #ifdef TEST_TOOL_DLL_EXPORTS
    #define TEST_TOOL_API     __declspec(dllexport)
    #else
    #define TEST_TOOL_API     __declspec(dllimport)
    #pragma message("**** Importation de la DLL (2) ****")
    #endif
     
    #include <stdio.h>
    #include <stdlib.h>
     
    class TEST_TOOL_API  CTest
    {
    public:
    	CTest();                                                   
    	~CTest();
    	void Somme();
     
    public:
    	int a;
    	int b;
    	int c;
    };
     
    #endif
    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
    18
    19
    20
    21
    22
    23
     
    //--------------------------------------------------------------------
    // Fichier de la dll .cpp
     
    #include "TestLib.h"
     
    CTest::CTest()
    {
    	a = 2;
    	b = 6;
    	c = 0;
    }
     
     
    CTest::~CTest()
    {
    }
     
    void CTest::Somme()
    {
    	c = a + b;
    	printf("\n **** %d + %d = %d ****\n",a,b,c);
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    # Makefile de la dll (exécuté sur mingw32) 
    ...
    library: obj
    	$(MKDIR) $(LIB_DIR_LIB)
    	ar rc $(LIB_DIR_LIB)/lib$(LIB_TEST_NAME).a $(LIB_DIR_SRC)/$(LIB_TEST_NAME).o 
    	ranlib $(LIB_DIR_LIB)/lib$(LIB_TEST_NAME).a
    	g++ -shared -o $(LIB_DIR_LIB)/$(LIB_TEST_NAME).dll $(LIB_DIR_SRC)/$(LIB_TEST_NAME).o -Wl,--kill-at,--output-def,$(LIB_DIR_SRC)/$(LIB_TEST_NAME).def   
    	dllwrap --def $(LIB_DIR_SRC)/$(LIB_TEST_NAME).def -o $(LIB_DIR_LIB)/$(LIB_TEST_NAME).dll $(LIB_DIR_SRC)/$(LIB_TEST_NAME).o
    ...

    Fichier .def généré par le makefile :

    EXPORTS
    _ZN5CTest5SommeEv @1
    _ZN5CTestC1Ev @2
    _ZN5CTestC2Ev @3
    _ZN5CTestD1Ev @4
    _ZN5CTestD2Ev @5

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    //--------------------------------------------------------------------
    // Fichier principal
    #include "TestLib.h"
     
    int main(int argc, char* argv[])
    {
    	CTest *_Test = new CTest();
    	_Test->Somme();
    	return 0;
    }

    Message d'erreur de visual c++ :

    --------------------Configuration: test3 - Win32 Debug--------------------
    Linking...
    Creating library Debug/test3.lib and object Debug/test3.exp
    test3.obj : error LNK2001: unresolved external symbol "public: void __thiscall CTest::Somme(void)" (?Somme@CTest@@QAEXXZ)
    test3.obj : error LNK2001: unresolved external symbol "public: __thiscall CTest::CTest(void)" (??0CTest@@QAE@XZ)
    Debug/test3.exe : fatal error LNK1120: 2 unresolved externals
    Error executing link.exe.

    test3.exe - 3 error(s), 0 warning(s)


    Je souhaite donc compiler ma dll sous mingw32 et l'intégrer dans visual c++.
    Je suis un peu perdu là... j'ai essayé un nombre considérable de solutions et rien ne passe. Par contre si la dll est crée sous visual, tout se déroule sans problème. De même une dll en C (en utilisant extern "C") fonctionne correctement.

    Je pense que c'est un problème de nom de fonction (voir .def). Car la compilation se passe bien, mais pas lédisiotn de liens.
    qqun peut-il m'éclairer ?
    merci

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 391
    Points : 347
    Points
    347
    Par défaut
    Bonjour

    Peut etre une piste!!

    J'ai l'impression que ton probleme de link vient du fait que le compilo decore le nom de tes fonctions quand tu crees ta DLL.


    Essai d'inclure un .def et de creer ta dll avec ce .def et les noms de fonction que tu desires, ne laisse pas le compilo le crée pour toi.

    Cordialement[/quote]

  3. #3
    Membre expérimenté Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Points : 1 544
    Points
    1 544
    Par défaut
    oh le vilain double post !!!
    ICI

    c'est pas bien !!

    par contre je te deconsielle de bosser sous visual si tu veux faire quelque chose de portable, le standard c'est pas son fort
    "vaste programme"

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    oui j'avoue j'ai un peu honte pour le double post dsl...
    Je vais essayer de définir mon .def à la main...
    Par contre je suis obligé que cela passe sous visual (ce n'est pas moi qui ai choisi cet environnement qui ne me plait vraiment pas...)

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    problème résolu, voir mon double post (honte sur moi ;-) ) http://www.developpez.net/forums/viewtopic.php?t=482505

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

Discussions similaires

  1. Pb de compilation lors de la création d'une DLL
    Par Annaced dans le forum Visual C++
    Réponses: 8
    Dernier message: 15/06/2010, 23h26
  2. Réponses: 4
    Dernier message: 10/04/2006, 16h12
  3. Problème de création d'une dll...
    Par adrien954 dans le forum C++Builder
    Réponses: 4
    Dernier message: 21/10/2005, 10h46
  4. Conventions à utiliser pour la création d'une DLL
    Par Writer dans le forum Langage
    Réponses: 3
    Dernier message: 02/08/2005, 09h24

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