2010-06-02 13 views
6

Ich lerne gerade einige CSP (Constraint Zufriedenheit) Theorie Zeug, und bin this Bibliothek zum Parsen von XML-Dateien. Ich verwende Xcode als IDE.Doppelte Symbol Linker Fehler (C++ Hilfe)

Mein Programm kompiliert gut, aber wenn es geht, um die Dateien zu verknüpfen, erhalte ich einen doppelten Symbolfehler mit der Datei XMLParser_libxml2.hh. Meine Dateien sind als solche getrennt:

Eine Klasse-Header-Datei, die die XMLParser Datei über
Eine Klasse Implementierungsdatei, die die Klasse Header-Datei enthält
Eine Hauptdatei, die die Klassenheaderdatei

Das Duplikat enthält Das Symbol tritt in main.o und classfile.o auf, aber soweit ich das beurteilen kann, füge ich diese .hh-Datei nicht zweimal hinzu.

Voll Fehler:

ld: duplicate symbol bool CSPXMLParser::UTF8String::to<std::basic_string<char, 
std::char_traits<char>, std::allocator<char> > >(std::basic_string<char, 
std::char_traits<char>, std::allocator<char> >&) constin 
/Users/vash265/CSP/Untitled/build/Untitled.build/Debug/Untitled.build/Objects- 
normal/x86_64/dStructFill.o and 
/Users/vash265/CSP/Untitled/build/Untitled.build/Debug/Untitled.build/Objects- 
normal/x86_64/main.o` 

Kopieren der Implementierung der Klasse in die Hauptdatei und unter der Klasse Implementierungsdatei aus dem Kompilierung Ziel entfernt den Fehler, aber es ist ein unorganisiertes Chaos auf diese Weise, und ich Ich werde sehr bald weitere Klassen hinzufügen (und es wäre nett, sie in separaten Dateien zu haben).

Wie ich es verstehe, wird dies durch die Datei (XMLParser_libxml2.hh) verursacht, die sowohl die Klassen - und Funktionsdefinition als auch die Implementierung in einer Datei hat (und es scheint, dass dies aufgrund der Verwendung von Vorlagen in dieser "Header" -Datei. Irgendwelche Ideen, wie man alle meine Klassendateien in meine main.cpp steckt? (Ich habe versucht #ifdefs, sie funktionieren nicht).

+3

Sind alle Funktionen (außer Memberfunktionen, die in einer Klassendefinition oder Funktionsvorlagen definiert sind) in der Kopfzeile als 'inline' deklariert? –

+0

benötigen wir mehr Details darüber, wie Ihr Code strukturiert ist und müssen wissen, ob die Klassen, die die doppelten Symbolfehler erzeugen, von Ihnen geschrieben wurden oder bereits existieren. Grundsätzlich bedeutet dies, dass Sie versuchen, Ihren Code zweimal zu verknüpfen. Es hört sich jedoch nach einem Problem an, das ich einmal hatte und das lag an der Art und Weise, wie ich meine App erstellte, dh ich verwendete eine Mischung aus statischer und dynamischer Verknüpfung. Stellen Sie also sicher, dass Sie alles statische oder alles dynamische verknüpfen. Eine Mischung aus beidem zu haben ist kompliziert und ich bin nicht darauf eingegangen –

+0

@James Wenn Sie auf die Header-Datei verweisen, die in der Verknüpfung angegeben wurde, dann glaube ich, dass alle Funktionen Mitgliederfunktionen von a sind Klasse. Es ist ein bisschen schwer zu sagen, da der Code eine Art Chaos ist. Soweit mein eigener Code geht, habe ich keine Funktionen, die keine Mitgliedsfunktionen sind. @Yan Die Dateien, die die Fehler generieren, werden letztendlich von mir erstellt. Der Fehler entstand dadurch, dass ich den XMLParser-Header (nicht von mir geschrieben) in meine Klassenheaderdatei einfügte, der wiederum in die Hauptfunktions- und Klassenimplementierungsdateien aufgenommen wurde (die ich geschrieben habe und die im Fehler angegebenen Dateien sind). – Vash265

Antwort

3

James hatte Recht. Die drei Template-Funktionen innerhalb der Header-Datei müssen inline deklariert werden, damit sie richtig verlinkt werden kann. Vielen Dank!