2010-09-07 20 views
5

ho la seguente configurazione (eventualmente questo non è troppo a nudo un esempio):riferimento definito utilizzando 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(); 
} 

Ora, quando uso inst in B.cpp ottengo undefined reference to inst.

Qualche idea su come risolvere questo problema?

+0

Si include # la definizione di 'classe MyClass' in B.cpp? –

+0

Dovresti includere il messaggio di errore del compilatore completo nel tuo post. –

risposta

0

Questo è un esempio troppo semplice per capire cosa sta succedendo. Tuttavia, in base a quanto sopra, è del tutto possibile che quando colpisce la riga in errore il compilatore non è a conoscenza di ciò che è effettivamente in MyClass e pertanto non può risolvere MyClassFunc.

Avremmo bisogno di vedere la definizione di MyClass e sapere dov'è la risposta.

+0

aggiornato su 'MyClass' –

0

si deve compilare il file di cui sopra A.cpp come

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

e poi durante la creazione del file eseguibile si dovrebbe scrivere il comando come segue:

g++ A.o B.o 
+1

O in un passo,' g ++ A.cpp B.cpp'. –

0

Dal codice esempio di base si postato direi che ti sei dimenticato di #include <B.h> nel tuo file B.cpp.

9

So che questa domanda è vecchia, ma potrebbe comunque essere utile per qualcuno.

La variabile globale (qui: MyClass inst) non dovrebbe essereexternper l'unità di compilazione che definiscono esso (qui: A.cpp)

Un modo per raggiungere questo obiettivo:

  • declare la variabile globale in un'intestazione separata (diciamo global.h) e includere questa intestazione nel * cpp utilizzando il SE.
  • rimuovere la parola chiave extern per l'unità di compilazione che definiscono loro (per esempio con #ifdef):

global.h assomiglia:

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

EXTERN MyClass inst; 

mentre A.h assomiglia:

#ifndef A_H_ 
#define A_H_ 

// your header content (without globals) 

#endif /* A_H_ */ 

e A.cpp:

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

Speranza che aiuta!

Problemi correlati