Estoy aprendiendo algo de teoría CSP (satisfacción de restricciones) en este momento, y estoy usando la biblioteca this para analizar archivos XML. Estoy usando Xcode como un IDE.Error duplicado del vinculador de símbolos (ayuda de C++)
Mi programa compila bien, pero cuando va a vincular los archivos, aparece un error de símbolo duplicado con el archivo XMLParser_libxml2.hh. Mis archivos están separados como tal:
Un archivo de cabecera de la clase que incluye el archivo XMLParser anterior
Un archivo de implementación de la clase que incluye el archivo de encabezado de clase
Un archivo principal que incluye el archivo de encabezado de clase
El duplicado el símbolo está ocurriendo en main.o y classfile.o, pero hasta donde puedo decir, en realidad no estoy agregando ese archivo .hh dos veces.
de 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`
Copia de la implementación de la clase en el archivo principal y teniendo el archivo de implementación de la clase fuera del objetivo compilación elimina el error, pero es un caos desorganizado esta manera, y estoy Agregaré más clases muy pronto (y sería bueno tenerlas en archivos separados).
Como he llegado a entenderlo, 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 a la 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).
¿Están todas las funciones (excepto las funciones miembro definidas dentro de una definición de clase o plantillas de función) en el encabezado declarado 'en línea'? –
necesitaríamos más detalles sobre cómo está estructurado su código y necesitamos saber si las clases que generan los símbolos duplicados están escritas por usted o ya existen. Básicamente, esto significa que estás intentando vincular tu código dos veces. Sin embargo, suena como un problema que tuve una vez y esto se debió a la forma en que estaba construyendo mi aplicación, es decir, estaba usando una combinación de enlaces estáticos y dinámicos. Así que asegúrese de vincular todo estático o todo dinámico. Tener una combinación de ambos es complicado y no entre en ese –
@James Si se refiere al archivo de encabezado que se proporcionó en el enlace, entonces creo que todas las funciones son funciones miembro de un clase. Es un poco difícil de decir ya que el código es un desastre. En lo que respecta a mi propio código, no tengo funciones que no sean funciones miembro. @Yan Los archivos que generan los errores son en última instancia creados por mí. El error surgió al incluir el encabezado XMLParser (no escrito por mí) en el archivo de cabecera de mi clase, que a su vez se incluyó en la función principal y los archivos de implementación de clase (que escribí, y son los archivos nombrados en el error). – Vash265