2010-09-07 10 views
5

Ich habe folgendes Setup (hoffentlich ist dies auch kein Beispiel blanke):undefined reference wenn extern mit

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(); 
} 

Nun, wenn ich inst in B.cpp verwenden erhalte ich undefined reference to inst.

Haben Sie eine Idee, wie Sie das beheben können?

+0

Haben Sie die Definition von 'class MyClass' in B.cpp eingeschlossen? –

+0

Sie sollten die vollständige Compiler-Fehlermeldung in Ihrem Post enthalten. –

Antwort

0

Dies ist zu einfach ein Beispiel, um herauszufinden, was los ist. Basierend auf dem Obigen ist es jedoch durchaus möglich, dass der Compiler, wenn er die fehlerhafte Zeile erreicht, keine Kenntnis davon hat, was tatsächlich in MyClass ist und daher MyClassFunc nicht auflösen kann.

Wir müssten die Definition von MyClass sehen und wissen, wo es für eine sichere Antwort ist.

+0

aktualisiert in Bezug auf 'MyClass' –

0

Sie haben die oben genannten Datei A.cpp als

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

zu kompilieren und dann, während die ausführbare Erstellung sollten Sie den Befehl wie folgt schreiben:

g++ A.o B.o 
+1

Oder in einem Schritt,' g ++ A.cpp B.cpp'. –

0

Aus dem Grundbeispielcode Sie posted Ich würde sagen, Sie haben in Ihrer B.cpp-Datei #include <B.h> vergessen.

9

Ich weiß, diese Frage ist alt, aber es könnte immer noch hilfreich für jemanden sein.

Die globale Variable (hier: MyClass inst) sollte nichtexternfür die Zusammenstellung Einheit sein, die es definieren (hier: A.cpp)

Eine Möglichkeit, dies zu erreichen:

  • declare Ihre globale Variable in einem separaten Header (sagen wir global.h) und diesen Header in die * cpp mit der se.
  • entfernen extern Schlüsselwort für die Übersetzungseinheit, die sie definieren (beispielsweise mit #ifdef):

global.h wie folgt aussieht:

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

EXTERN MyClass inst; 

während A.h wie folgt aussieht:

#ifndef A_H_ 
#define A_H_ 

// your header content (without globals) 

#endif /* A_H_ */ 

und A.cpp:

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

Hoffe, es hilft!