2013-10-10 13 views
7

Entschuldigung, wenn das eine wiederholte Frage ist, aber ich habe ein paar Stunden lang gesucht, und ich bekomme widersprüchliche Antworten ... und was noch schlimmer ist, keiner von ihnen sind am Arbeiten.Eclipse/GCC: Unbekannter Verweis auf externe Variable

Es ist eine einfache Sache. Ich habe viele Quelldateien, und ich habe einige gemeinsame Parameter, die ich in einer einzigen Datei sein möchte, sagen "Parameter.h". Ich möchte diese Parameter (einmal) zur Laufzeit setzen, indem Sie sie als Argumente an das Programm übergeben.

PS: Ich weiß, dass es ein besserer Weg ist, alles als Argumente für Funktionen zu übergeben, aber es ist ein klobiges Stück Code und ich muss bald ein Ergebnis bekommen, ohne zu viele Änderungen vorzunehmen.

Hier ist ein minimales Arbeitsbeispiel:

Parameters.h

#ifndef PARAMETERS_H_ 
#define PARAMETERS_H_ 

extern int Alpha; 

#endif 

main.cpp

#include <iostream> 
#include "Parameters.h" 

int main(int argc, char * argv[]) 
{ 
    const int Alpha = 12.0; 
} 

Functions.cpp

#include "Parameters.h" 

double Foo(const double& x) 
{ 
    return Alpha*x; 
} 

Als ich mit

gcc main.cpp Functions.cpp 

kompilieren bekomme ich die Fehlermeldung "Functions.cpp :(text + 0xa.): Undefined reference to` Alpha '".

Antwort

17

Sie haben eine globale Variable mit dem Namen Alpha deklariert, aber Sie haben sie nicht definiert. In genau einer Quelldatei in Dateigültigkeitsbereich schreiben:

int Alpha; 

oder mit einem Initialisierer:

int Alpha = 42; 

Beachten Sie, dass die lokale Variable mit dem Namen Alpha Sie innerhalb main definiert haben, ist verschieden von und völlig unabhängig von dieser Globale Variable.

+0

Vielen Dank! Das Problem war, wie Sie sagen, dass ich Alpha im Dateibereich in main.cpp nicht definiert habe. Jetzt fühle ich mich wie ein Idiot :-) Nochmals vielen Dank. – MGA

+0

ist es notwendig, Alpha als 'extern' zu definieren, wenn man bedenkt, dass die Deklaration in einer Header-Datei ist? – ldgorman

+1

@ldgorman: Wenn Sie 'extern' nicht verwenden, wäre es eine Definition, nicht nur eine Deklaration. Wenn Sie diesen Header dann in mehr als eine Quelldatei einfügen, erhalten Sie Linker-Fehler über mehrere Definitionen desselben Symbols. –

Verwandte Themen