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 :

Erreur au link dans un .o


Sujet :

C++

  1. #1
    Membre averti Avatar de Flo.
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2002
    Messages : 379
    Points : 404
    Points
    404
    Par défaut Erreur au link dans un .o
    Bonjour,

    Je travaille avec mingw sous Windows XP.

    J'ai créé une dll base.dll qui contient la déclaration (base.h) et la définition (base.cpp) d'une classe virtuelle MyBase.

    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
    #ifndef _MYBASE_
    #define _MYBASE_
     
    namespace NSBase
    {
    	class MyBase
    	{
    	public:
    		MyBase();
    		MyBase(const MyBase & base);
    		MyBase(const int & value);
    		virtual void Echo() = 0;
     
    	protected:
    		int value;
    	};
    };
     
    #endif
    Ensuite je voudrais créér une seconde dll derived.dll qui contient la déclaration (derived.h) et la définition (derived.cpp) d'une classe MyDerived qui hérite de MyBase. J'ai donc juste fait un include de base.h dans derived.h.

    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
    #ifndef _MYDERIVED_
    #define _MYDERIVED_
     
    #include "base.h"
     
    namespace NSDerived
    {
    	class MyDerived : public NSBase::MyBase
    	{
    	public:
    		MyDerived();
    		MyDerived(const MyDerived & derived);
    		MyDerived(const int & value);
    		void Echo();
    	};
    };
     
    #endif
    Et ça marche. Dans les 2 cas je passe par un .o temporaire avant de faire le .dll. Et pour derived.dll, je lie directement avec base.dll.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g++ -shared -o derived.dll derived.o base.dll
    J'ai mis un zip avec tout le code en pièce jointe.

    En fait ça c'est que j'essaie de faire sur un programme plus conséquent. Et là ça marche pas et je comprends pas. Si je fait le rapprochement avec le programme test, le link me sort une erreur qui correspondrait à

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    derived.o:  dans la fonction MyDerived() :
    derived.cpp:6:référence indéfinie vers NSBase::MyBase()
    derived.cpp:14:référence indéfinie vers NSBase::MyBase(NSBase::MyBase const &)
    Pareil pour le destructeur et le constructeur par copie. Pourtant, j'ai vérifié tout. Je fais bien l'édition des liens avec la bonne dll au bon endroit tout ça. Cela donne l'impression que base.dll (pour rester dans le parallèle) ne contient pas la définition de MyBase.

    Je sais bien que si je vous donne pas le code qui pose problème vous pouvez pas m'aider. Cependant est-ce que vous avez déjà eu ce cas. J'ai vu sur des forums qu'il fallait respecter l'ordre des dépendances (ce que je fait). Il y a peut-être autre chose de ce type qui fait que ça compile pas.

    Merci.

    Flo.
    Fichiers attachés Fichiers attachés

  2. #2
    Membre averti Avatar de Flo.
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2002
    Messages : 379
    Points : 404
    Points
    404
    Par défaut
    Bon ben au final j'ai trouvé ...

    J'ai juste rajouté ceci devant mes constructeurs et destructeurs :

    __declspec( dllexport )

    Et cela marche.

    Je dois compiler mon projet sous visual studio 2008 aussi. Alors j'ai pensé à rajouté cette décoration pour visual. J'ai testé avec mingw histoire de voir. Compilation et édition de liens fonctionnent du coup avec les 2 compilateurs.

    J'ai quand même du mal à comprendre pourquoi cette décoration permet l'édition des liens avec mingw pour mon gros projet alors que j'en ai pas besoin pour mon petit projet de test.

    Est-ce que cela veut dire que je vais devoir décorer toutes mes déclarations de fonctions ?

    Flo.

  3. #3
    screetch
    Invité(e)
    Par défaut
    chez moi ca a compilé. On a sans doute pas la meme version de GCC.
    En revanche tu vas sans doute devoir travailler avec les regles d'export (__declspec(dllexport) / __declspec(dllimport))

    sous windows, lorsqu'on utilise une classe venant d'une autre DLL, il faut compiler cette DLL en declarant la classe __declspec(dllexport). Lorsqu'on l'utilise dans le programme principal, il faut l'importer avec __declspec(dllimport).
    Du coup en general on fait des macros DLLEXPORT:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #ifdef BUILDING_MY_DLL_AU_BEAU_NOM
    # define MYDLLAUBEAUNOMEXPORT __declspec(dllexport)
    #else
    # define MYDLLAUBEAUNOMEXPORT __declspec(dllimport)
    #endif
    puis sur ta classe:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    class MYDLLAUBEAUNOMEXPORT MyBase
    { ... };
    compile ta DLL en donnant -DBUILDING_MY_DLL_AU_BEAU_NOM pour le "mode export"
    compile ton executable sans ce flag

Discussions similaires

  1. template dans header mais erreur au link
    Par ctxnop dans le forum Langage
    Réponses: 1
    Dernier message: 11/12/2013, 16h20
  2. [Lazarus] Erreur édition des liens (linking) dans programme d'essais mysql
    Par over_score dans le forum Lazarus
    Réponses: 1
    Dernier message: 13/07/2009, 11h51
  3. erreur de link(age) g++
    Par corwin dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 05/05/2004, 12h33
  4. [wxWindows] Erreur de link pour ODBC
    Par ovh dans le forum wxWidgets
    Réponses: 3
    Dernier message: 28/01/2004, 16h38
  5. DirectDrawCreate erreur de link
    Par Ing_Ben dans le forum DirectX
    Réponses: 1
    Dernier message: 01/12/2002, 19h46

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