Error duplicado del enlazador de símbolos(ayuda de C++)
linker constraint-programming (1)
Estoy aprendiendo algo de teoría CSP (satisfacción de restricciones) en este momento, y estoy usando esta biblioteca para analizar archivos XML. Estoy usando Xcode como un IDE.
Mi programa compila bien, pero cuando va a vincular los archivos, obtengo un error de símbolo duplicado con el archivo XMLParser_libxml2.hh. Mis archivos están separados como tal:
Un archivo de encabezado de clase que incluye el archivo XMLParser anterior
Un archivo de implementación de clase que incluye el archivo de encabezado de clase
Un archivo principal que incluye el archivo de encabezado de clase
El símbolo duplicado está ocurriendo en main.o y classfile.o, pero hasta donde puedo decir, en realidad no estoy agregando ese archivo .hh dos veces.
Error completo:
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`
Copiar la implementación de la clase en el archivo principal y sacar el archivo de implementación de la clase del objetivo de compilación elimina el error, pero es un desastre desorganizado de esta manera, y agregaré más clases muy pronto (y sería bueno tenerlos en archivos separados).
Como he llegado a entender, esto es causado por el archivo (XMLParser_libxml2.hh) que tiene la definición de la clase y la función y la implementación en un archivo (y parece que esto podría haber sido necesario debido al uso de plantillas en ese archivo ''encabezado''). ¿Alguna idea sobre cómo desplazar todos mis archivos de clase en mi main.cpp? (He intentado #ifdefs
, no funcionan).
James estaba en lo correcto. Las tres funciones de plantilla dentro del archivo de encabezado deben declararse en línea para que se vinculen correctamente. ¡Gracias!