Двойной символ QT в файлах mainwindow.o и ***.o

Я немного запутался, я пытаюсь разработать простое приложение.

Поток приложения: MainWindow -> Dialog 1 -> Dialog 2.

MainWindow импортирует Dialog1.h, а Dialog1.h импортирует Dialog2.h.

1) Если я импортирую библиотеки TinyXML как в Dialog1.cpp, так и в Dialog2.cpp, компилятор выдает следующую ошибку: повторяющийся символ **RANDOM TINYXML CLASS* в: Dialog1.o Dialog2.o

2) Поскольку Dialog1.h импортирует Dialog2.h, даже если я пытаюсь импортировать библиотеки TinyXML только в Dialog2.h, я все равно получаю следующую ошибку: повторяющийся символ ** RANDOM TINYXML CLASS * в: mainwindow.o moc_Dialog2.o

Я ничего не импортирую в mainwindow. Тем не менее ошибка сохраняется.

Любая помощь в том, где я ошибаюсь?

Журнал ошибок (есть 732, просто скопипастил кучу):

duplicate symbol __ZN11TiXmlString7reserveEm in:
    mainwindow.o
    selectorteach.o
duplicate symbol __ZN11TiXmlString8nullrep_E in:
    mainwindow.o
    selectorteach.o
duplicate symbol __ZN11TiXmlString6assignEPKcm in:
    mainwindow.o
    selectorteach.o
duplicate symbol __ZN11TiXmlString6appendEPKcm in:
    mainwindow.o
    selectorteach.o
duplicate symbol __ZplRK11TiXmlStringS1_ in:
    mainwindow.o
    selectorteach.o
duplicate symbol __ZplRK11TiXmlStringPKc in:
    mainwindow.o
    selectorteach.o
duplicate symbol __ZplPKcRK11TiXmlString in:
    mainwindow.o
    selectorteach.o
duplicate symbol __Z10TiXmlFOpenPKcS0_ in:
    mainwindow.o
    selectorteach.o
duplicate symbol __ZN9TiXmlBase12EncodeStringERK11TiXmlStringPS0_ in:
    mainwindow.o
    selectorteach.o
duplicate symbol __ZN9TiXmlBase6entityE in:
    mainwindow.o
    selectorteach.o
duplicate symbol __ZN9TiXmlNodeC2ENS_8NodeTypeE in:
    mainwindow.o
    selectorteach.o
duplicate symbol __ZTV9TiXmlNode in:
    mainwindow.o
    selectorteach.o
duplicate symbol __ZN9TiXmlNodeD2Ev in:
    mainwindow.o
    selectorteach.o
duplicate symbol __ZN9TiXmlNodeD1Ev in:
    mainwindow.o
    selectorteach.o
duplicate symbol __ZN9TiXmlNodeD0Ev in:
    mainwindow.o
    selectorteach.o
duplicate symbol __ZNK9TiXmlNode6CopyToEPS_ in:
    mainwindow.o
    selectorteach.o
duplicate symbol __ZN9TiXmlNode5ClearEv in:
    mainwindow.o
    selectorteach.o

--------------------------------------------------------------------

duplicate symbol __ZNK12TiXmlElement22QueryUnsignedAttributeEPKcPj in:
    mainwindow.o
    teachmode.o
duplicate symbol __ZNK12TiXmlElement18QueryBoolAttributeEPKcPb in:
    mainwindow.o
    teachmode.o
duplicate symbol __ZN9TiXmlBase11StringEqualEPKcS1_b13TiXmlEncoding in:
    mainwindow.o
    teachmode.o
duplicate symbol __ZNK12TiXmlElement20QueryDoubleAttributeEPKcPd in:
    mainwindow.o
    teachmode.o
duplicate symbol __ZN12TiXmlElement12SetAttributeEPKci in:
    mainwindow.o
    teachmode.o
duplicate symbol __ZN17TiXmlAttributeSet12FindOrCreateEPKc in:
    mainwindow.o
    teachmode.o
duplicate symbol __ZN14TiXmlAttribute11SetIntValueEi in:
    mainwindow.o
    teachmode.o
duplicate symbol __ZN17TiXmlAttributeSet3AddEP14TiXmlAttribute in:
    mainwindow.o
    teachmode.o
duplicate symbol __ZN12TiXmlElement18SetDoubleAttributeEPKcd in:
    mainwindow.o
    teachmode.o
duplicate symbol __ZN14TiXmlAttribute14SetDoubleValueEd in:
    mainwindow.o
    teachmode.o
duplicate symbol __ZNK12TiXmlElement5PrintEP7__sFILEi in:
    mainwindow.o
    teachmode.o
duplicate symbol __ZNK12TiXmlElement6AcceptEP12TiXmlVisitor in:
    mainwindow.o
    teachmode.o
duplicate symbol __ZNK12TiXmlElement5CloneEv in:
    mainwindow.o
    teachmode.o
duplicate symbol __ZNK12TiXmlElement7GetTextEv in:
    mainwindow.o
    teachmode.o
duplicate symbol __ZN13TiXmlDocumentC2Ev in:

--------------------------------------------------------------------

duplicate symbol __ZN9TiXmlBase6entityE in:
    mainwindow.o
    moc_selectorteach.o
duplicate symbol __ZN9TiXmlNodeC2ENS_8NodeTypeE in:
    mainwindow.o
    moc_selectorteach.o
duplicate symbol __ZTV9TiXmlNode in:
    mainwindow.o
    moc_selectorteach.o
duplicate symbol __ZN9TiXmlNodeD2Ev in:
    mainwindow.o
    moc_selectorteach.o
duplicate symbol __ZN9TiXmlNodeD1Ev in:
    mainwindow.o
    moc_selectorteach.o
duplicate symbol __ZN9TiXmlNodeD0Ev in:
    mainwindow.o
    moc_selectorteach.o
duplicate symbol __ZNK9TiXmlNode6CopyToEPS_ in:
    mainwindow.o
    moc_selectorteach.o
duplicate symbol __ZN9TiXmlNode5ClearEv in:
    mainwindow.o
    moc_selectorteach.o
duplicate symbol __ZN9TiXmlNode12LinkEndChildEPS_ in:
    mainwindow.o
    moc_selectorteach.o
duplicate symbol __ZN13TiXmlDocument8SetErrorEiPKcP16TiXmlParsingData13TiXmlEncoding in:
    mainwindow.o
    moc_selectorteach.o
duplicate symbol __ZNK9TiXmlNode11GetDocumentEv in:
    mainwindow.o
    moc_selectorteach.o
duplicate symbol __ZN9TiXmlBase11errorStringE in:
    mainwindow.o
    moc_selectorteach.o
duplicate symbol __ZN16TiXmlParsingData5StampEPKc13TiXmlEncoding in:
    mainwindow.o
    moc_selectorteach.o
duplicate symbol __ZN9TiXmlNode14InsertEndChildERKS_ in:
    mainwindow.o
    moc_selectorteach.o
duplicate symbol __ZN9TiXmlNode17InsertBeforeChildEPS_RKS_ in:
    mainwindow.o
    moc_selectorteach.o
duplicate symbol __ZN9TiXmlNode16InsertAfterChildEPS_RKS_ in:
    mainwindow.o
    moc_selectorteach.o
duplicate symbol __ZN9TiXmlNode12ReplaceChildEPS_RKS_ in:

--------------------------------------------------------------------

    moc_teachmode.o
duplicate symbol __ZN9TiXmlText5ParseEPKcP16TiXmlParsingData13TiXmlEncoding in:
    mainwindow.o
    moc_teachmode.o
duplicate symbol __ZN16TiXmlDeclaration5ParseEPKcP16TiXmlParsingData13TiXmlEncoding in:
    mainwindow.o
    moc_teachmode.o
duplicate symbol __ZTV12TiXmlPrinter in:
    mainwindow.o
    moc_teachmode.o
duplicate symbol __ZTV14TiXmlAttribute in:
    mainwindow.o
    moc_teachmode.o
duplicate symbol __ZTV12TiXmlUnknown in:
    mainwindow.o
    moc_teachmode.o
duplicate symbol __ZTV9TiXmlText in:
    mainwindow.o
    moc_teachmode.o
duplicate symbol __ZN11TiXmlString4nposE in:
    mainwindow.o
    moc_teachmode.o
duplicate symbol __ZTI9TiXmlNode in:
    mainwindow.o
    moc_teachmode.o
duplicate symbol __ZTI12TiXmlElement in:
    mainwindow.o
    moc_teachmode.o
duplicate symbol __ZTI13TiXmlDocument in:
    mainwindow.o
    moc_teachmode.o
duplicate symbol __ZTI12TiXmlComment in:
    mainwindow.o
    moc_teachmode.o
duplicate symbol __ZTI16TiXmlDeclaration in:
    mainwindow.o
    moc_teachmode.o
duplicate symbol __ZTI14TiXmlAttribute in:
    mainwindow.o
    moc_teachmode.o
duplicate symbol __ZTS14TiXmlAttribute in:
    mainwindow.o
    moc_teachmode.o
duplicate symbol __ZTS9TiXmlNode in:
    mainwindow.o
    moc_teachmode.o
duplicate symbol __ZTS12TiXmlComment in:
    mainwindow.o
    moc_teachmode.o
duplicate symbol __ZTI9TiXmlText in:
    mainwindow.o
    moc_teachmode.o
duplicate symbol __ZTS9TiXmlText in:
    mainwindow.o
    moc_teachmode.o
duplicate symbol __ZTS16TiXmlDeclaration in:
    mainwindow.o
    moc_teachmode.o
duplicate symbol __ZTI12TiXmlUnknown in:
    mainwindow.o
    moc_teachmode.o
duplicate symbol __ZTS12TiXmlUnknown in:
    mainwindow.o
    moc_teachmode.o
duplicate symbol __ZTS13TiXmlDocument in:
    mainwindow.o
    moc_teachmode.o
duplicate symbol __ZTI12TiXmlPrinter in:
    mainwindow.o
    moc_teachmode.o
duplicate symbol __ZTS12TiXmlPrinter in:
    mainwindow.o
    moc_teachmode.o
duplicate symbol __ZTS12TiXmlElement in:
    mainwindow.o
    moc_teachmode.o
ld: 732 duplicate symbols for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [untitled.app/Contents/MacOS/untitled] Error 1
19:03:15: The process "/usr/bin/make" exited with code 2.
Error while building/deploying project untitled (kit: Desktop Qt 5.4.0 clang 64bit)
When executing step "Make"

Примечание. Когда я включаю файлы только в Dialog2.cpp, проект компилируется, и все функции работают должным образом. Проблема возникает только тогда, когда я помещаю его в заголовочный файл. Мои директивы включения для TinyXML: -

   #include <tinystr.h>
   #include <tinyxml.h>
   #include <tinystr.cpp>
   #include <tinyxmlerror.cpp
   #include <tinyxml.cpp>
   #include <tinyxmlparser.cpp>

Если я включу только исходные файлы, такие как:

#include <tinystr.h>
#include <tinyxml.h>

Я получаю следующий журнал ошибок:

Undefined symbols for architecture x86_64:
  "TiXmlString::assign(char const*, unsigned long)", referenced from:
      TiXmlString::operator=(char const*) in teachmode.o
  "TiXmlString::nullrep_", referenced from:
      TiXmlString::quit() in teachmode.o
  "TiXmlElement::SetAttribute(char const*, char const*)", referenced from:
      saveData(product) in teachmode.o
  "TiXmlElement::SetAttribute(char const*, int)", referenced from:
      saveData(product) in teachmode.o
  "TiXmlElement::TiXmlElement(char const*)", referenced from:
      saveData(product) in teachmode.o
  "TiXmlDocument::LoadFile(char const*, TiXmlEncoding)", referenced from:
      saveData(product) in teachmode.o
  "TiXmlDocument::TiXmlDocument()", referenced from:
      saveData(product) in teachmode.o
  "TiXmlDeclaration::TiXmlDeclaration(char const*, char const*, char const*)", referenced from:
      saveData(product) in teachmode.o
  "TiXmlNode::LinkEndChild(TiXmlNode*)", referenced from:
      saveData(product) in teachmode.o
  "TiXmlNode::TiXmlNode(TiXmlNode::NodeType)", referenced from:
      TiXmlText::TiXmlText(char const*) in teachmode.o
  "TiXmlNode::~TiXmlNode()", referenced from:
      TiXmlDocument::~TiXmlDocument() in teachmode.o
      TiXmlText::TiXmlText(char const*) in teachmode.o
  "TiXmlDocument::SaveFile(char const*) const", referenced from:
      saveData(product) in teachmode.o
  "TiXmlNode::FirstChildElement() const", referenced from:
      TiXmlNode::FirstChildElement() in teachmode.o
  "vtable for TiXmlDocument", referenced from:
      TiXmlDocument::~TiXmlDocument() in teachmode.o
  NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
  "vtable for TiXmlText", referenced from:
      TiXmlText::TiXmlText(char const*) in teachmode.o
  NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [untitled.app/Contents/MacOS/untitled] Error 1
19:25:51: The process "/usr/bin/make" exited with code 2.
Error while building/deploying project untitled (kit: Desktop Qt 5.4.0 clang 64bit)
When executing step "Make"

person Aakash Thakkar    schedule 05.02.2015    source источник
comment
Вы уверены, что символ действительно случайный? Когда вы получаете повторяющийся символ или ошибку компоновщика с несколькими определениями, это обычно означает, что вы определили символ в файле заголовка и включили этот файл заголовка в несколько исходных файлов. Файлы заголовков редко должны определять символы, только декларировать их. Более конкретное, чем это, невозможно получить, не видя какой-либо источник или фактическую ошибку.   -  person Some programmer dude    schedule 05.02.2015
comment
Возможно, вы случайно включили свой собственный класс несколько раз? Используете ли вы include guards во всех своих классах?   -  person Bowdzone    schedule 05.02.2015
comment
@JoachimPileborg Обновлен вопрос с фактическим выводом ошибок. Случайность - это просто разные имена классов. Я использовал поиск по проектам, чтобы убедиться, что повторений не существует.   -  person Aakash Thakkar    schedule 05.02.2015
comment
@Bowdzone Я использую поиск по проекту, чтобы гарантировать, что операторы включения были написаны только один раз. Обновил вопрос с выводом ошибки.   -  person Aakash Thakkar    schedule 05.02.2015
comment
Вы включаете исходный файл TinyXML или файл header? Пожалуйста, покажите какой-нибудь код, желательно минимальный, полный и проверяемый пример!   -  person Some programmer dude    schedule 05.02.2015
comment
Почему вы включаете cpp файлов? Я никогда не видел библиотеки, где это было бы необходимо   -  person Bowdzone    schedule 05.02.2015
comment
@Bowdzone Я пытался не включать их, но включение их позволяет правильно скомпилировать. Я обновил журнал ошибок, который возникает, когда они не включены. Спасибо!   -  person Aakash Thakkar    schedule 05.02.2015


Ответы (1)


Не включайте исходные файлы, это и есть причина вашей проблемы!

Включите только заголовочные файлы, а затем скомпилируйте и свяжите исходные файлы, как вы это делаете со своими собственными исходными файлами.


Исходный файл содержит определения всех функций, и в вашей программе может быть только одно определение.

person Some programmer dude    schedule 05.02.2015
comment
Привет! Я пытался не включать их, но они также дают неопределенные символы, для этого я также обновил журнал ошибок в вопросе. Пожалуйста, проверьте, спасибо! - person Aakash Thakkar; 05.02.2015
comment
@AakashThakkar Это потому, что вам нужно строить с этими исходными файлами тоже. У вас, как я понял, в проекте два исходных файла. Просто добавьте исходные файлы TinyXML в свой проект, чтобы они были собраны и связаны с вашим кодом. - person Some programmer dude; 05.02.2015
comment
Вот оно! Спасибо! - person Aakash Thakkar; 05.02.2015