PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C++ - Fehler beim Linken



MartyMcFly
20-05-2007, 18:26
Hallo,

ich habe ein Programm beim Kompilieren meiner Quelldateien.

Der Aufruf

g++ arcFlagsIO.cpp run.cpp -o run

liefert die Fehlermeldung


/tmp/ccL0MajQ.o:(.bss+0x0): multiple definition of `EdgeWeightMeta::MAX_VALUE'
/tmp/ccVXLJDM.o:(.bss+0x0): first defined here
collect2: ld returned 1 exit status

EdgeWeightMeta::MAX_VALUE ist vom Typ 'static const int' und wird in der Datei 'definitions.h' definiert, die ich in beiden .cpp-Dateien einbinden muss.
Weiß vielleicht jemand, wie man den Fehler behebt, bzw. ihm weiter auf den Grund geht?
Vielen Dank im Voraus. :)

anda_skoa
20-05-2007, 18:33
Du darfst sie nur in einer Quelldatei definieren. Deklarieren im Header ist ok, aber die Definition (Speicherplatzzuweisung, Initialisierung) darf nur in einer Übersetzungseinheit sein (d.h. in diesem Falle nur in einer Quelldatei)

Ciao,
_

MartyMcFly
20-05-2007, 18:45
Wenn ich die Zeile

const EdgeWeight EdgeWeightMeta::MAX_VALUE = std::numeric_limits<EdgeWeight>::max();
auskommentiere, dann funktioniert es tatsächlich. Was verwunderlich ist, ist jedoch, dass darunter folgende Zeilen nicht zu Problemen führen:



const unsigned int NULLNODE = std::numeric_limits<unsigned int>::max();
const unsigned int NULLEDGE = std::numeric_limits<unsigned int>::max();
const EdgeWeight INFTY = std::numeric_limits<EdgeWeight>::max()/2;


Die Datei habe ich selbst nicht geschrieben und sie wird in anderen Projekten auch verwendet. Es wundert mich etwas, dass das nicht geht. :confused:

EDIT: Im Kontext sieht das jetzt so aus

struct EdgeWeightMeta {
static const EdgeWeight MAX_VALUE;
};
//const EdgeWeight EdgeWeightMeta::MAX_VALUE = std::numeric_limits<EdgeWeight>::max();

const unsigned int NULLNODE = std::numeric_limits<unsigned int>::max();
const unsigned int NULLEDGE = std::numeric_limits<unsigned int>::max();
const EdgeWeight INFTY = std::numeric_limits<EdgeWeight>::max()/2;

anda_skoa
21-05-2007, 14:48
Die anderen sind nicht static

Ein static Member wird zwar wie andere Sachen auch im gemeinsamen Header deklariert, das Initialiseren (und damit das Speicherzuweisen) darf aber nur in einer CPP Datei passieren.

Die Zeile selbst ist korrekt, nur an der falschen Stelle (im Header).

Ciao,
_