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 du linker sur déclaration EXTERN


Sujet :

C

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Septembre 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2016
    Messages : 7
    Points : 6
    Points
    6
    Par défaut Erreur du linker sur déclaration EXTERN
    Bonjour,

    En poursuivant mon parcours de l'article de Jeff Glatt concernant la programmation COM en C, j'ai une question concernant un problème de déclaration EXTERN.

    En utilisant l'outil de création des GUID, on obtient ces quelques lignes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DEFINE_GUID(IID_IExample ,
    	0x903a37ab, 0x4f59, 0x4030, 0xb8, 0xd3, 0x74, 0x2c, 0xce, 0x97, 0x24, 0xbf);
    Le problème est que le linker butte sur la non résolution de la variable externe Error LNK2001 unresolved external symbol _IID_IExample.
    La définition de la macro DEFINE_GUID, ainsi que la définition de EXTERN_C, dans guiddef.h est la suivante :
    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
    #ifndef EXTERN_C
    #ifdef __cplusplus
    #define EXTERN_C    extern "C"
    #else
    #define EXTERN_C    extern
    #endif
    #endif
     
    #ifdef DEFINE_GUID
    #undef DEFINE_GUID
    #endif
     
    #ifdef INITGUID
    #define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
            EXTERN_C const GUID DECLSPEC_SELECTANY name \
                    = { l, w1, w2, { b1, b2,  b3,  b4,  b5,  b6,  b7,  b8 } }
    #else
    #define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
        EXTERN_C const GUID FAR name
    #endif // INITGUID
    EXTERN_C est bien définis comme étant extern et non extern "C". Je ne comprend toutefois pas pourquoi on force la déclaration d'une variable IID comme étant externe.

    Si je redéclare la macro DEFINE_GUID comme suis, au début de mon code (retrait de extern), tout se passe bien.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #ifdef DEFINE_GUID
    #undef DEFINE_GUID
    #endif
    #define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
        const GUID FAR name
    Toutefois, cela ne me semble pas propre, et je pense que je dois avoir loupé quelque chose.
    Pour info, je compile bien en C (fichier en .c, l'option /TC de VS

    Merci de vos lumières.
    Cdlt

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Fais un #define INITGUID avant tes includes, ça définira les GUIDs au lieu de les déclarer en extern.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Septembre 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2016
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    Merci, ca fonctionne.

    si je comprend bien, cela donne en phase de préprocesseur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    extern const struct _GUID __declspec(selectany) IID_IExample ={0x903a37ab, 0x4f59, 0x4030, {0xb8, 0xd3, 0x74, 0x2c, 0xce, 0x97, 0x24, 0xbf}}
    la doc de selectany explique que la variable IID_IExample est alors "externally visible". Donc on expose la constante IID_IExample, c'est bien cela?
    J'étais resté sur le fait que extern était pour faire référence à une variable déclarée dans un autre module, dont on est client. L'inverse en somme.

    Merci pour ton aide.

    Cdlt

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

Discussions similaires

  1. Réponses: 16
    Dernier message: 30/04/2009, 15h51
  2. Réponses: 5
    Dernier message: 04/01/2008, 09h55
  3. [XSLT] Débutant erreur sur déclaration template
    Par nagdrir dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 27/08/2007, 16h08
  4. Erreur sur déclaration de liste
    Par La Truffe dans le forum C++
    Réponses: 4
    Dernier message: 19/02/2006, 19h38
  5. Réponses: 16
    Dernier message: 19/11/2005, 16h47

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