2013-03-04 2 views
10

Von dem, was ich verstehe, wird dieser Fehler durch nicht richtig verwendet Header-Wachen, wenn Sie mehrere Dateien einschließlich der gleichen Datei haben. In meinem Fall ist dies der Baum enthalten ist, die den Fehler verursacht:Funktion bereits in .obj definiert

File A includes Z, which contains the functions I need. File B includes A, and file C includes A.

Ohne #pragma once ‚s, gibt das Programm eine Reihe von Variationen des gleichen Fehlers:

blahblah.obj: error LNK2005: class some::namespace::ObjectType Object already 
    defined in dialogDlg.obj 

ich nur Ich frage mich, angesichts der Include-Struktur, die ich beschrieben habe, was ist der richtige Weg, um dies richtig zu kompilieren?

Ich versuchte mit #pragma once auf Datei Z, aber das hat nicht funktioniert. Ich habe auch einmal auf Datei A #pragma ausprobiert, was auch nicht funktioniert hat. Endlich habe ich es sowohl auf A als auch auf Z versucht, auch nicht funktioniert.

+0

etwas gibt mir die Idee, die Sie keine separaten Header-Dateien verwenden ?? –

Antwort

12

Es scheint, Sie versuchen, definieren eine Variable in einer Header-Datei. Wenn diese Header-Datei in mehreren Quelldateien enthalten ist, wird sie in jeder Quelldatei definiert, wodurch Sie den Fehler erhalten.

Stattdessen deklarieren Sie es als extern und dann in einer Ihrer Quelldateien definieren.

So in der Header-Datei:

extern ObjectType Object; 

Und in einer Quelldatei:

ObjectType Object; 
+2

Ich würde nur hinzufügen, dass dies nichts mit Wachen zu tun hat. Schließen Sie die Wächter-Hilfe ein, um zu verhindern, dass die gleiche Kopfzeile in einer Quelldatei * mehrfach verwendet wird. * Wir betrachten einen Header, der Probleme verursacht, indem er in * verschiedene * Quelldateien eingeschlossen wird. – Angew

+0

Okay, wenn ich Zugriff auf diese Variablen und Objekte in Datei B und Datei C (beide CPP-Dateien) benötigen, gibt es eine Möglichkeit, dies sauber zu erreichen? – xcdemon05

+1

Solange Sie b.cpp und c.cpp zusammen kompilieren, erreicht diese Lösung bereits, was Sie wollen. – us2012