Nicht aufgelöstes externes Symbol "public: virtuelle Struktur QMetaObject const * __thiscall Parent
Habe ich geerbt, eine Klasse von QObject :
class Parent: public QObject
{
Q_OBJECT
QObject* cl;
public:
Parent(QObject *parent=0):QObject(parent) {
cl = NULL;
}
QObject* getCl() const {
return cl;
}
void setCl(QObject *obj) {
cl = obj;
}
};
Aber wenn ich Schreibe :
Parent ev;
Bekomme ich die folgende Fehlermeldung:
main.obj:-1: error: LNK2001: unresolved external symbol "public: virtual struct QMetaObject const * __thiscall Parent::metaObject(void)const " (?metaObject@Parent@@UBEPBUQMetaObject@@XZ)
main.obj:-1: error: LNK2001: unresolved external symbol "public: virtual void * __thiscall Parent::qt_metacast(char const *)" (?qt_metacast@Parent@@UAEPAXPBD@Z)
main.obj:-1: error: LNK2001: unresolved external symbol "public: virtual int __thiscall Parent::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@Parent@@UAEHW4Call@QMetaObject@@HPAPAX@Z)
InformationsquelleAutor der Frage sayyed mohsen zahraee | 2013-01-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Löschen Sie die
debug
Ordner Ihrer Anwendung und führen Sie es erneut, um dieses problem zu beheben.InformationsquelleAutor der Antwort sayyed mohsen zahraee
Wenn Sie Visual Studio, löschen Sie die Zeile
Q_OBJECT
aus der header-Datei, speichern Sie die Datei, setzenQ_OBJECT
zurück in die header-Datei, speichern Sie die Datei erneut. Dies sollte generieren diemoc_*
Datei und aufbauen sollte, und der link richtig.InformationsquelleAutor der Antwort MPicazo
Bemerkte ich einige Antworten basieren auf Visual Studio.
Diese Antwort basiert auf der Qt Creator.
Anders als der name suggerieren, die
Rebuild Project
nicht auszulöschen alles und bauen von Grund auf. Wenn Sie vor kurzem HinzugefügtQObject
(und/oder Q_OBJECT) zu Ihrer Klasse, die Sie ausführen müssenqmake
wieder, z.B.Dies ist, weil standardmäßig
qmake
läuft nur, wenn Sie wesentliche änderungen an Ihrer Lösung, wie das hinzufügen neuer Quelldateien oder ändern Sie die.pro
- Datei. Wenn Sie änderungen an einer vorhandenen Datei, die es nicht wissen, es braucht, um laufenqmake
.Als rückfallebene, um brute-force-Qt zu bauen alles von Grund auf neu, löschen Sie die
Debug
oderRelease
Ordner.InformationsquelleAutor der Antwort Stephen Quan
Also das Problem war, ich brauchte die Qt MOC-Kompiler zu kompilieren meine .h-Datei. Dies ist erforderlich für alle Klassen, die zum erweitern von QObject oder einer seiner Kinder. Das Update involed (für mich) Rechtsklick auf die header Datei, Eigenschaften auswählen, und die Einstellung der Positionsart "Qt MOC-Eingang", dann auf "Compile" auf die Kopfzeile, und dann addition der resultierenden moc_myfilename.cpp Datei in mein Projekt.
InformationsquelleAutor der Antwort Vern Jensen
Wenn Ihr moc-Dateien werden generiert, in dem visual studio-Projekt versuchen, um Sie ins Projekt ein, wenn Sie sind nicht enthalten in Projekt dann neu erstellen.
InformationsquelleAutor der Antwort Akın Yılmaz
Ich hatte das gleiche problem in Visual Studio, und löste es, indem Sie die folgenden Schritte aus:
Dann in die Benutzerdefinierte Build-Tool-Konfiguration:
set "Command Line":
"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" "-fStdAfx.h" "-f../../../src/mit dem Namen.h" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_NETWORK_LIB -DWIN32_LEAN_AND_MEAN -DDIS_VERSION=7 -D_MATH_DEFINES_DEFINED "-I.\SFML_STATIC" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtNetwork"
set "Ausgänge":
.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp
set "Zusätzliche Abhängigkeiten":
$(QTDIR)\bin\moc.exe;%(FullPath)
Ihre genauen Werte können unterschiedlich sein. Sie sind in der Regel angewendet, die über ein Qt-plugin.
InformationsquelleAutor der Antwort Trevor Hickey
Ich CMake verwalten Qt-Projekte und die neuen Q_OBJECT muss Hinzugefügt werden, unter der QT4_WRAP_CPP nennen. Dies generiert die moc_*.cxx für die Aufnahme in das Projekt und bereinigen die nicht aufgelöste externe Verweise.
InformationsquelleAutor der Antwort whatnick
Ich hatte dieses problem mit Visual Studio 2012 hatte ich ein Q_OBJECT definition der Klasse in meiner cpp-Datei. Verschieben der Klassendefinition in der header-Datei das Problem gelöst.
Sieht es aus wie es sollte möglich sein, die Unterstützung Q_OBJECT-Klasse in die cpp-Datei durch hinzufügen der cpp-Datei, moc, aber ich habe nicht versucht dies.
InformationsquelleAutor der Antwort Edward
In meinem Fall (mit QtAdd-in mit VS2012 und Qt v4.8.4) keiner der oben genannten Vorschläge gearbeitet.
Für einige Grund, VS konnte nicht erzeugen ordnungsgemäße moc-Dateien (build-Ausgang: Keine relevanten Klassen gefunden. Keine Ausgabe erzeugt.) und wenn ich zusammengestellt entsprechenden Header per hand (Einstellung qt-moc als compiler und klicken auf 'Compile'), die es produziert leere moc-Datei.
Was funktioniert hat war das Zusammentragen aller notwendigen mocs von der Kommandozeile aus (moc -o moc_SomeClass.cpp SomeClass.h) ersetzen und dann das falsche in GeneratedFiles Ordner.
Dies ist die einzige Lösung (und nicht bequemer für ein großes Projekt), Projekt-build erfolgreich, aber nicht wirklich erklären seltsam VS/QtAdd-im Verhalten.
InformationsquelleAutor der Antwort dianull
Mit QtAdd-in mit VS2010 erkannte ich die moc_*.cpp-Dateien wurden aktualisiert, in der GeneratedFiles/Debug-Ordner, obwohl ich in den release-Modus. Kopieren Sie die Dateien in den Release-Ordner für mich gearbeitet.
InformationsquelleAutor der Antwort zengaja
Ich Hinzugefügt cpp/ui-Dateien zu meinem Projekt manuell, aber vergaß hinzuzufügen, die header-Datei, die explizit als header-Datei. Jetzt beim kompilieren bekam ich eine ähnliche Fehlermeldung wie oben und die moc_*.cpp-Datei(en) nicht generiert wurden, werden in der debug - (oder release -) - directory der build. Das war nicht eine so offensichtliche Fehler, qmake nicht beschweren und die anderen als linker Nachricht bekam ich keine Fehler.
Also falls jemand auf das gleiche problem wieder (oder macht den gleichen copy & pase Fehler): stellen Sie sicher, dass die header-Dateien wurden ebenfalls Hinzugefügt, um Ihr Projekt-Datei
InformationsquelleAutor der Antwort Vinoj John Hosan
Ich hatte dieses problem mit einer "eigenen Klasse". Qt verwendet dieses Modell, obwohl aus Ihrem code. Ich habe kommen, um wirklich wie es selbst.
Im Grunde, Sie haben eine privat deklariert-Klasse in einer öffentlichen header-Datei class-definition, mit einem Zeiger auf eine Instanz, als ein Mitglied der öffentlichkeit-Klasse. (Hinweis: Sie können auch finden, das Leben leichter zu erklären als ein Freund der Klasse auch.)
Erstellen Sie dann die private version der Klasse in die cpp-Datei, die für die öffentlichkeit ein. NICHT erstellen Sie eine header-Datei für das private Klasse. Tun all die schmutzige Arbeit mit dieser Klasse. Dies blendet alle, die Implementierung der öffentlichen Klasse wie auch andere private Mitglieder.
Ohne zu erklären, dass weitere, hier ist der Punkt, wie es bezieht sich auf diesen thread. Um Q_OBJECT Arbeit, die ich brauchte, um dieses an den cpp:
Der cpp-layout geht so:
InformationsquelleAutor der Antwort BuvinJ
War ich vor kurzem beim Wechsel von MingW, MSVC. Ich hatte eine Prototyp-Klasse/struct aufgeführt als eine Klasse und MingW nicht Verstand.
MSVC sieht definitiv einen Unterschied zwischen
class
undstruct
beim prototyping geht.Hoffe, das hilft jemand anderes eines Tages.
InformationsquelleAutor der Antwort phyatt
In meinem Fall keine der oben gearbeitet, aber es war Total mein Fehler.
Hatte ich overrided virtuelle Funktionen .h-Datei (erklärt Sie), hatte aber nie definiert .cpp 🙂
InformationsquelleAutor der Antwort zar
Ich mein problem gelöst, durch hinzufügen dieser auf meine header-Datei :
InformationsquelleAutor der Antwort Nadjib Dz
Entweder Antwort funktioniert bei mir in VS-2013-Umgebung. Ich habe letztendlich das problem lösen durch entfernen der .h/.cpp aus dem Projekt, und wieder hinzufügen.
InformationsquelleAutor der Antwort Adam Woo
Arbeite ich in VS2015 mit einem integrierten Perforce p4v-client.
In meinem Fall Notgedrungen versucht, um die moc-Datei zu einem depo, wenn ich rückgängig diese operation, Perforce entfernt dieses moc-Datei aus dem Projekt und es gelöscht.
Die Datei wurde neu erstellt, nachdem die nächste Zusammenstellung, aber es war nicht enthalten im Projekt, muss ich Sie manuell hinzufügen, um Dateien Erzeugt, wenn ich endlich verstanden, was das problem war.
InformationsquelleAutor der Antwort Flot2011
Ich habe das gleiche problem, meine Lösung war, die Kodierung( meine Datei mit "UTF16LE BOM" kann nicht erzeugen moc.exe ) , y erstellen Sie eine Datei mit ASCII-enconding und es funktioniert.
HxD HexEditor kann Ihnen helfen, zu sehen, die Kodifizierung.
InformationsquelleAutor der Antwort Jefferson Rondan
Arbeite ich in VisualStudio nur mit einem C++ - Projekt, das ein QT-interface. Entfernen nur die Q_OBJECT-Linie arbeitet Geldstrafen zu entfernen, die linker-Fehler. Scheint nicht zu jedem negativen Effekt.
InformationsquelleAutor der Antwort Jan Laloux
Ich weiß, dass dies eine sehr alte Frage, aber es scheint immer noch interessant (ich habe hier mindestens 4 oder 5 mal in den letzten Monaten) und scheint, wie ich gefunden, ein weiterer Grund für die möglich ist, um diese Fehler.
In meinem Fall in der header-Datei, die ich falsch getippt:
Nur nach Prüfung der gesamten Ausgabe fand ich heraus, dass zu der Linie, die der compiler strahlte eine Warnung.
Dass ich nun entfernt die zusätzlichen Anführungszeichen meine QObject kompiliert einwandfrei!!!
InformationsquelleAutor der Antwort Brutus
Für mich, dies ist die Ursache: einige header-oder source-Datei nicht enthalten in der QT-Projekt-Datei
InformationsquelleAutor der Antwort Sanbrother