2010-09-07 18 views
5

Mam następującą konfigurację (mam nadzieję, że to nie jest zbyt gołymi przykład):niezdefiniowana odniesienia przy użyciu 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(); 
} 

Teraz, gdy używam Inst w B.cpp uzyskać undefined reference to inst.

Każdy pomysł, jak to naprawić?

+0

Czy #include definicję klasy 'MyClass' w B.cpp? –

+0

Powinieneś zamieścić pełny komunikat o błędzie kompilatora w swoim poście. –

Odpowiedz

0

Jest to zbyt goły przykład, aby ustalić, co się dzieje. Jednak w oparciu o powyższe jest całkowicie możliwe, że gdy trafi na linię awarii, kompilator nie ma wiedzy o tym, co faktycznie jest w MyClass i dlatego nie może rozwiązać MyClassFunc.

Musielibyśmy zobaczyć definicję MyClass i wiedzieć, gdzie jest na pewno odpowiedź.

+0

aktualizowane dotyczące 'MyClass' –

0

Musisz skompilować wyżej wymieniony plik A.cpp jak

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

a następnie podczas tworzenia pliku wykonywalnego należy wpisać następujące polecenie:

g++ A.o B.o 
+1

lub w jednym kroku,' g ++ A.cpp B.cpp'. –

0

od podstawowego kodu przykład ty napisałem Powiedziałbym, że zapomniałeś #include <B.h> w swoim pliku B.cpp.

9

Wiem, że to pytanie jest stare, ale nadal może być pomocne dla kogoś.

zmienna globalna (tu: MyClass inst) nie powinno byćexterndla jednostki kompilacji, które definiują go (tutaj: A.cpp)

Jednym sposobem osiągnięcia tego celu:

  • declare Twoja zmienna globalna w oddzielnym nagłówku (załóżmy global.h) i dołącz ten nagłówek do * cpp przy użyciu se.
  • usunąć extern słowa kluczowego do urządzenia kompilacji które określenia je (na przykład z #ifdef)

global.h wygląda następująco:

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

EXTERN MyClass inst; 

podczas A.h wygląda następująco:

#ifndef A_H_ 
#define A_H_ 

// your header content (without globals) 

#endif /* A_H_ */ 

i A.cpp:

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

Nadzieję, że to pomaga!

Powiązane problemy