2010-09-07 31 views
5

je la configuration suivante (nous espérons que ce ne soit pas trop à nu un exemple):référence non définie lors de l'utilisation extern

Ah

typedef std::map<unsigned int, float> MyClass; 
extern MyClass inst; 

A.cpp

MyClass inst; 

Bh

#include <A.h> 
void foo(); 

B.cpp

#include <B.h> 
void foo { 
    inst.myClassFunc(); 
} 

Maintenant, quand je l'utilise dans inst B.cpp je reçois undefined reference to inst.

Une idée sur la façon de résoudre ce problème?

+0

Est-ce que vous #incluez la définition de 'class MyClass' dans B.cpp? –

+0

Vous devez inclure le message d'erreur du compilateur complet dans votre message. –

Répondre

0

Ceci est un exemple trop simple pour comprendre ce qui se passe. Cependant, basé sur ce qui précède, il est tout à fait possible que quand il frappe la ligne défaillante le compilateur n'a aucune connaissance de ce qui est réellement dans MyClass et ne peut donc pas résoudre MyClassFunc.

Nous aurions besoin de voir la définition de MyClass et de savoir où il est de répondre à coup sûr.

+0

mis à jour concernant 'MyClass' –

0

Vous devez compiler le fichier mentionné ci-dessus A.cpp comme

g++ -c A.cpp 
g++ -c B.cpp 

puis lors de la création de l'exécutable, vous devez écrire la commande comme suit:

g++ A.o B.o 
+1

Ou en une seule étape,' g ++ A.cpp B.cpp'. –

0

A partir de l'exemple de code de base que vous posté Je dirais que vous avez oublié de #include <B.h> dans votre fichier B.cpp.

9

Je sais que cette question est ancienne, mais elle pourrait être utile pour quelqu'un.

La variable globale (ici: MyClass inst) ne devrait pas êtreexternpour l'unité de compilation qui définissent il (ici: A.cpp)

Une façon d'y parvenir:

  • déclare votre variable globale dans un en-tête séparé (disons global.h) et d'inclure cet en-tête dans le * cpp en utilisant le se.
  • enlever le mot-clé extern pour l'unité de compilation qui définissent les (par exemple avec #ifdef):

global.h ressemble:

#ifdef A_H_ 
    #define EXTERN 
#else 
    #define EXTERN extern 
#endif 

EXTERN MyClass inst; 

alors que A.h ressemble à:

#ifndef A_H_ 
#define A_H_ 

// your header content (without globals) 

#endif /* A_H_ */ 

et A.cpp:

#include "A.h" 
#include "global.h" // after A.h inclusion, we need A_H_ definition 

Hope it helps!