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 :

Erreur LNK2001 sur exportation de classes runtime


Sujet :

MFC

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Erreur LNK2001 sur exportation de classes runtime
    Bonjour,

    Je développe une "MFC extension dll" sous VisualC++ 6.0. Toutes les classes que j'y ai mises sont exportées par AFX_EXT_CLASS; elles sont toutes dérivées plus ou moins directement de CObject, et utilisent DECLARE_DYNAMIC.

    Le projet de la dll compile et édite les liens sans erreur, mais quand j'importe la dll, j'ai des erreurs à l'édition de lien, sur deux des classes.
    Dans les deux cas l'erreur est du type :

    error LNK2001: unresolved external symbol "public: static struct CRuntimeClass const CMaClasse::classCMaClass
    Après avoir trouvé un semblant d'explication dans MSDN, j'ai suivit le conseil qui s'y trouvait en redéfinissant AFX_DATA :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #undef AFX_DATA
    #define AFX_DATA_EXT_CLASS
    Mais à la compilation il me dit que je ne doit pas faire ça quand j'exporte déjà toute la classe.

    Je commence à sécher un peu, si quelqu'un a un conseil, je suis preneur

    Merci d'avance[/quote]

  2. #2
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    Commençons par le début.
    Tu as bien mis IMPLEMENT_DYNAMIC dans les .cpp des deux classes ?

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Oui m'sieur Toutes les classes de la dll utilisent DECLARE_DYNAMIC dans le .h et IMPLEMENT_DYNAMIC dans le .cpp.

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Des petites précisions des fois que ça aie son importance :
    Seules les classes pour lesquelles j'utilise les fonctionnalités runtime (par un appel à IsTypeOf en l'occurence) cause l'erreur de lien.
    Le texte exact de l'erreur est :
    error LNK2001: unresolved external symbol "public: static struct CRuntimeClass const CMaClasse::classCMaClasse" (?classCMaClasse@CMaClasse@@2UCRuntimClass@@B)
    Dans mon premier message j'avais omis de mentionner l'indication du lien ordinal, ça a peut-être son importance

    Enfin, je suis en train de déplacer ces classes du programme principal. Quand elles étaient toutes dans le même programme, tout tournait pile et poil. Or je n'ai pas changé une ligne de code dans leur description...

    Vala, vala...
    De mon côté j'ai toujours aucune autre piste

  5. #5
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Août 2002
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2002
    Messages : 106
    Points : 113
    Points
    113
    Par défaut
    salut,

    as-tu crées plusieurs dll avec ton programme ou tout est dans la même?

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Salut,

    il y a plusieurs Dlls; les message survient dans l'une d'entre elle dès lors que j'utilise la fonction IsTypeOf sur des classes d'une des autres Dlls.

  7. #7
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Août 2002
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2002
    Messages : 106
    Points : 113
    Points
    113
    Par défaut
    Salut,

    c'est que tes dlls sont à la fois importées et exportées, plutot que AFX_EXT_CLASS dans la déclaration de ta classe, tu dois définir un truc du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #ifdef MADLL_IMPL
       #define CLASS_DECL_MADLL   __declspec(dllexport)
    #else
       #define CLASS_DECL_MADLL   __declspec(dllimport)
    #endif
    et dans les classes de ta dll, tu utilises CLASS_DECL_MADLL au lieu de AFX_EXT_CLASS. (dans MADLL_IMPL MADLL est le nom de ta dll)

    Essaye ça, je peux malheureusement pas t'en dire beaucoup plus sur le sujet, j'ai juste eu un problème similaire dans un programme ou j'utilisais des dll qui en appelaient d'autres et étaient appelées et j'ai galéré un bon moment avant de trouver ce bout de code sur un site japonais donc à part le code, j'ai rien compris mais maintenant ça marche.

    J'espère que ça pourra t'aider

  8. #8
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    sorry je t'avais un peu oublié. dsl.

    Je dirais pas mieux que jul54. tout est expliqué dans la Technical note 033 de MFC

  9. #9
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Août 2002
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2002
    Messages : 106
    Points : 113
    Points
    113
    Par défaut
    Merci pour le lien Abelman,

    je vais enfin pouvoir en savoir un peu plus là dessus (ça va faire un an que j'ai fait ça sans du coup piger vraiment tout)

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Ok ça marche
    Merci à tous les deux pour votre aide

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

Discussions similaires

  1. erreur C2440 sur un projet class library
    Par yann458 dans le forum C++/CLI
    Réponses: 3
    Dernier message: 20/12/2011, 14h06
  2. Erreur LNK2001 sur qsort
    Par cjacquel dans le forum MFC
    Réponses: 1
    Dernier message: 15/05/2007, 22h02
  3. Erreur 3001 sur un export de table.
    Par domdobrazil dans le forum Access
    Réponses: 1
    Dernier message: 05/12/2006, 16h14
  4. Question sur exports et les classes (pour une dll)
    Par DjPoke dans le forum Langage
    Réponses: 7
    Dernier message: 08/08/2005, 19h25

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