2011-11-23 11 views
6

Ho cercato di scrivere una semplice applicazione Qt come questo:Perché questa semplice applicazione Qt non collegare

main.cpp:

#include <QApplication> 

class MyApp : public QApplication { 
     Q_OBJECT 
public: 
     MyApp(int argc, char* argv[]); 
}; 

MyApp::MyApp(int argc, char* argv[]) : 
     QApplication(argc,argv) { 
} 

int main(int argc, char* argv[]) { 
    MyApp app(argc,argv); 
    return app.exec(); 
} 

Ma quando ho provato a compilare e collegarlo con Qt Creator 2.3.1 (Qt 4.7.4) ottengo 3 errori "simbolo esterno non risolto":

I think they are somehow related to the MetaObjectCompiler of Qt, but I can't figure out a solution. I know it's not considered good programming style in c++ to put declarations and definitions in one file, but that's not the point here. In my opinion it should be possible since there is nothing syntactically wrong here.

+0

modificato 'compile' in 'collegamento' in quanto questo non è un problema del compilatore. – stijn

risposta

12

Utilizzare il codice seguente e assicurarsi di eseguire qmake (Build> Esegui qmake) prima della costruzione.

#include <QApplication> 

class MyApp : public QApplication { 
    Q_OBJECT 
public: 
    MyApp(int argc, char* argv[]); 
}; 

MyApp::MyApp(int argc, char* argv[]) : 
    QApplication(argc,argv) { 
} 

int main(int argc, char* argv[]) { 
    MyApp app(argc,argv); 
    return app.exec(); 
} 

#include "main.moc" 

Spiegazione: Quando si include l'Q_OBJECT macro, questi segnali Qt per fare un mucchio di roba che non è standard C++, come ad esempio i segnali e slot. Lo fa eseguendo moc, che in gran parte è un generatore di codice. L'esecuzione di qmake crea i metadati in modo che quando il progetto viene creato, sappia quali file siano moc, ecc.

+1

Questo ha funzionato bene. Ma non so ancora perché funzioni senza includere il file .moc quando inserisco la parte della dichiarazione in un file di intestazione separato. – Karsten

+2

Raramente è necessario includere esplicitamente tutti i file '.moc'. Qt lo gestisce per te. In effetti, il * solo * tempo che ho mai usato è quando si creano programmi di esempio come quello sopra in cui si ha solo un 'main.cpp'. Penso che la ragione è che 'qmake' gestisce automaticamente i file di intestazione di scansione per te, ma non i file cpp, perché quelli normalmente non contengono roba che richiede' moc'-ed. http://doc.qt.nokia.com/latest/moc.html –

3

penso che è necessario Moc il file e si include il main.moc risultante in fondo.

0

Penso che questo abbia qualcosa a che fare con QMake. Non è che l'app eseguibile non possa vedere la classe DLL esportata. È che il file obj per la classe non esiste. Esecuzione di QMake dal menu Creazione Creator di QT e quindi l'elaborazione sembra funzionare.

Why does this Simple Qt Application not link

0

Ho appena incontrato lo stesso problema, ed è stato risolto modificando il set di caratteri del mio colpo di testa da Unicode ad ANSI.

Problemi correlati