2010-06-02 5 views
6

J'apprends actuellement des trucs de théorie CSP (satisfaction de contraintes) et j'utilise la bibliothèque this pour analyser des fichiers XML. J'utilise Xcode comme IDE.Erreur de lien de symbole en double (aide C++)

Mon programme compile bien, mais quand il va lier les fichiers, j'obtiens une erreur de symbole en double avec le fichier XMLParser_libxml2.hh. Mes fichiers sont séparés en tant que tels:

Un fichier d'en-tête de classe qui comprend le fichier XMLParser ci-dessus
Un fichier de mise en œuvre de classe qui inclut le fichier d'en-tête de la classe
Un fichier principal qui inclut le fichier d'en-tête de classe

Le double Le symbole apparaît dans main.o et classfile.o, mais pour autant que je sache, je ne l'ajoute pas deux fois.

erreur complète:

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` 

Copie la mise en œuvre de la classe dans le fichier principal et en prenant le fichier de mise en œuvre de la classe de la cible de compilation supprime l'erreur, mais il est un désordre désorganisé cette façon, et je Je vais ajouter plus de classes très bientôt (et ce serait bien de les avoir dans des fichiers séparés). Comme je viens de le comprendre, cela est dû au fait que le fichier (XMLParser_libxml2.hh) a à la fois la définition et l'implémentation de la classe et de la fonction dans un fichier (et il semble que cela ait pu être nécessaire en raison du utilisation de modèles dans ce fichier 'en-tête'). Des idées sur la façon de contourner tous mes fichiers de classe dans mon main.cpp? (J'ai essayé #ifdefs, ils ne fonctionnent pas).

+3

Toutes les fonctions (à l'exception des fonctions membres définies dans une définition de classe ou des modèles de fonction) sont-elles dans l'en-tête déclaré «en ligne»? –

+0

nous aurions besoin de plus de détails sur la façon dont votre code est structuré et besoin de savoir si les classes générant les erreurs de symboles en double sont écrites par vous ou existent déjà. Fondamentalement, cela signifie que vous essayez de lier votre code deux fois. Cela ressemble cependant à un problème que j'ai eu une fois et cela était dû à la façon dont je construisais mon application, c'est-à-dire que j'utilisais un mélange de liens statiques et dynamiques. Alors assurez-vous de lier tout statique ou tout dynamique. Pour avoir un mélange des deux est compliqué et je ne suis pas allé dans cela –

+0

@James Si vous faites référence au fichier d'en-tête qui a été fourni dans le lien, alors je crois que toutes les fonctions sont des fonctions membres d'un classe. C'est un peu difficile à dire car le code est un peu en désordre. En ce qui concerne mon propre code, je n'ai pas de fonctions qui ne sont pas des fonctions membres. @Yan Les fichiers générant les erreurs sont finalement créés par moi. L'erreur est survenue en incluant l'entête XMLParser (non écrite par moi) dans mon fichier d'en-tête de classe, qui à son tour était inclus dans la fonction principale et les fichiers d'implémentation de classe (que j'ai écrits, et les fichiers nommés dans l'erreur). – Vash265

Répondre

3

James avait raison. Les trois fonctions de gabarit à l'intérieur du fichier d'en-tête devaient être déclarées en ligne pour qu'il soit correctement lié. Merci!

Questions connexes