2010-07-16 13 views
11

Ricevo il seguente errore del linker durante la creazione della mia applicazione.Errore Q_OBJECT linker!

HIMyClass.obj:: error: unresolved external symbol "public: virtual struct QMetaObject const * __thiscall CHIMyClass::metaObject(void)const " ([email protected]@@[email protected]@XZ) File not found : HIMyClass.obj

HIMyClass.obj:: error: unresolved external symbol "public: virtual void * __thiscall CHIMyClass::qt_metacast(char const *)" ([email protected]@@[email protected]) File not found : HIMyClass.obj

HIMyClass.obj:: error: unresolved external symbol "public: virtual int __thiscall CHIMyClass::qt_metacall(enum QMetaObject::Call,int,void * *)" ([email protected]@@[email protected]@@[email protected]) File not found : HIMyClass.obj

La mia dichiarazione di classe è come

class CHIMyClass:public QDialog 
{ 
    Q_OBJECT 

    .... 

}; 

Quando io commento Q_OBJECT l'errore di linker si spegne (e ovviamente io non sono in grado di utilizzare i segnali e gli slot). Sto usando Qt Creator come IDE e Qt 4.5.3. Quando restituisco Ricostruisci tutti è definito che verrà chiamato QMake. Immagino che, la sua generazione di file moc_ * è dove si trova il problema. Sto usando Windows XP e cl come compilatore.

Quale potrebbe essere la causa di questo errore del linker?

+0

Forse 'File non trovato: HIMyClass.obj' ci dice che Qt Creator non ha visto i file moc/obj/temp? – mosg

+1

Davvero, riesegui qmake. Inoltre, controlla i caratteri "\" mancanti o extra nel tuo file .pro. – andref

risposta

27

Tali errori di solito indicano che non è stata aggiunta l'intestazione della classe alla variabile "HEADERS" nel file pro (il compilatore di meta oggetto genera file moc_ solo per le intestazioni elencate in questa variabile). Ricordati di eseguire qmake dopo aver cambiato il file .pro!

+0

Il file di intestazione corrispondente è già disponibile sotto la variabile HEADERS che comunque sta affrontando il problema però .. Non è la ragione .. almeno nel mio caso .. :( – liaK

+2

Elimina a mano tutti i file generati da qmake e tutti i file oggetto, quindi esegui nuovamente qmake. – chalup

+1

@ chalup, ho cancellato tutti i file MOC, OBJ, RCC e ho eseguito qmake, ora funziona correttamente. Anche se sono contento che abbia funzionato, questo è folle .. Perché un comportamento così indefinito? Qualsiasi ipotesi ?? – liaK

0

Verificare che le necessarie opzioni di configurazione Qt sono presenti nel file pro (QT += core gui almeno. Anche provare manualmente l'eliminazione di tutto ciò costruita/creata nella directory di compilazione. A volte capita che moc non riesce a funzionare per qualche ragione.

si può anche provare a eseguire il comando moc te stesso, e vedere che cosa uscite (potete trovare la riga di comando nella scheda "Compila uscita" in QtCreator

UPDATE:. thisrelative problema sembra suggerire che don' t definire QT_DLL durante la compilazione. Puoi provare un nuovo e semplice progetto QtCreator (con un widget che sottoclassi la finestra principale per esempio) e provalo. Dovrebbe contenere automaticamente un'intestazione Q_OBJECT e provare a confrontare i file .pro e l'output del compilatore.

+0

Non mancano i simboli Qt, ma i simboli generati dal moc per la sua stessa classe. Quindi preferirei andare con Chalup e controllare che l'intestazione sia elencata in HEADERS. potrebbe anche aiutare una build completamente pulita. –

+0

Collega bene tutte le altre classi che hanno macro [email protected], ho incluso il file nella sezione HEADERS e ho provato le build pulite più di una volta .. Nessuna fortuna però .. :( – liaK

1

Controllare il file MakeFile.debug e forse HIMyClass non esiste.

Ho appena rinominato MakeFile.debug, Pulisci il progetto e Ricostruisci tutto e viene compilato.

12

Ho avuto un problema simile ed è stato risolto utilizzando il feedback di andref. All'interno Qt Creator ho semplicemente:

  1. Costruire/Pulire tutti
  2. Costruire/Run QMake
  3. Costruire/Esegui
+0

Questo lo ha risolto per me – ThePosey

+0

qmake è la nota fondamentale;) –

1

ho avuto lo stesso problema, ma nel mio caso non è stato sufficiente a clean -> build. Così ho dovuto cancellare manualmente tutti i file creati nel processo di compilazione (Mekefiles, ui descriptionns in cpp, e in generale l'intera directory creata dal processo di compilazione) e solo dopo la creazione.

0

sulla mia scatola osx ciò era dovuto alla mancanza di file moc *. Ho risolto questo problema rimuovendo il file dal mio file .pro codificato in utf-8. scriverò un bug con qt.

errore per ricerche goggle ... NOTA: un vtable mancante di solito indica che la prima funzione membro virtuale non incorporata non ha definizione.

"vtable for MainWindow", referenced from:

MainWindow::MainWindow(QWidget*)in mainwindow.o 
1

Dopo aver scritto questo post, ho rivisto

ho scoperto che ho bisogno di toccare il file .pro prima ricostruzione, vale a dire

  1. Aggiungere caratteri casuali
  2. Salva
  3. Elimina caratteri casuali
  4. Salva
  5. generazione di progetto

passaggi 1-4 sembra invalidare tutti i vecchi file moc * costringendo qmake per ricostruirle. Altrimenti, un progetto di ricostruzione sembra utilizzare i file stanti moc *.

[MODIFICA] Risposta aggiornata.

Da quando ho scritto questo post, ho praticamente ricevuto clean, qmake quindi build. Lo qmake è importante poiché riproduce i file moc * necessari quando si modificano i file .h e si modifica l'ereditarietà con Q_OBJECT. Infatti, in alcuni casi, potresti anche essere in grado di fare semplicemente qmake quindi build per una build incrementale.

0

ho trovato un altro possibile causa e soluzione a questo errore

Questo errore si verifica anche se uno ha dichiarato lo slot in .h file, ma non ha preso corpo nella realizzazione

0

ho avuto questo problema . Verificare se esiste una descrizione dell'implementazione dello slot nel file .cpp.

0

Avevo rimosso #include "main.moc" dal mio file principale, e ho dimenticato di riaggiungerlo ... E 'stata una divertente perdita di tempo!

0

Le risposte da @chalup e @ierax mi hanno aiutato. Ho dovuto chiudere il creatore di Qt e aprirlo di nuovo anche se per qmake ha effetto. Ho seguito questi passaggi: 1. Spostata la definizione della classe in un file di intestazione. 2. Aggiunto il file di intestazione per proiettare e assicurato che sia elencato contro HEADERS + = \ list in .pro file. 3. Pulisci tutto 4. chiudi QtCreator (su Windows 10) 5. Elimina Makefile dalla directory del progetto 6. Apri QtCreator e apri il progetto. 7. Qmake per garantire che i makefile siano generati. 8. Ricostruzione di tutti

Questi passaggi mi hanno aiutato a risolvere questo problema - ho faticato per oltre un'ora con varie altre risposte e metodi che non hanno funzionato. Prima di eseguire qmake assicurati di cancellare makefile e chiudi QtCreator (applicabile su Windows 10).