errore non definito linker di riferimento con segnali e slot
-
26-09-2019 - |
Domanda
Utilizzando Qt Creator, sto creando una classe con slot personalizzati in Qt:
class CustomEdit : public QTextEdit
{
Q_OBJECT
public:
CustomEdit(QWidget* parent);
public slots:
void onTextChanged ();
};
Comunque, sto ottenendo questo errore linker:
undefined reference to 'vtable for CustomEdit'
La documentazione dice:
se si ottiene errori di compilazione lungo le linee di "undefined reference to vtable per LcdNumber", probabilmente avete dimenticato di eseguire il moc o per includere l'output MOC nel comando di collegamento.
... ma non è ovvio che cosa ciò significhi.
C'è qualcosa che ho bisogno di aggiungere alla mia classe, o per il file .pro?
Modifica - Ecco il mio file .pro:
QT += network \ script \ webkit \ xml TARGET = MyApp TEMPLATE = app SOURCES += main.cpp \ MainWindow.cpp \ CustomEdit.cpp HEADERS += MainWindow.h \ CustomEdit.h FORMS += mainwindow.ui
Modifica
questa domanda si occupa della stessi problemi, ma le risposte non rendono chiaro come posso risolvere questo problema in Qt Creator. Devo aggiungere esplicitamente il file cpp moc generati alla mia lista di file da collegare? Che sembra come un dolore.
Soluzione
Qt Creator è un IDE che viene utilizzato per creare i vostri progetti Qt. È tutto. Ma qmake permette di buid il progetto. Da qmake ,
qmake automatizza la generazione di Makefile in modo che solo poche righe di informazioni sono necessari per creare ogni Makefile. qmake genera un Makefile sulla base delle informazioni in un file di progetto. qmake contiene funzionalità aggiuntive per sostenere lo sviluppo di Qt, tra cui automaticamente le regole di generazione per moc e UIC.
Si don necessario includere i file MOC a parte, ma è necessario eseguire qmake che contiene tutte le informazioni relative ai file MOC richiesti. Date un'occhiata al Makefile.debug
generate o Makefile.release
dopo qmake e si possono trovare tutti i file moc saranno inclusi per voi.
Ora per eseguire qmake in Qt Creator, basta andare a Build->RebuildAll
che si svolgerà il qmake e tutti i file (MOC) saranno generati e collegati (in Makefile.debug) pure.
Speriamo che questo elimate vostro riferimento non definito.