2011-11-23 15 views
6

Traté de escribir una simple aplicación Qt como esto:¿Por qué esta aplicación Qt simple no vincula

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(); 
} 

Pero cuando traté de compilar y vincularlo con Qt creador 2.3.1 (Qt 4.7.4) consigo 3 errores "símbolo externo sin resolver":

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

ha cambiado 'compilar' a 'enlace' ya que este no es un problema del compilador. – stijn

Respuesta

12

Usa el código siguiente y asegúrate de ejecutar qmake (compilar> ejecutar qmake) antes de construir.

#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" 

Explicación: Cuando se incluye la Q_OBJECT macro, esto indica Qt para hacer un montón de cosas que no es estándar C++, tales como señales y ranuras. Lo hace ejecutando moc, que en gran parte es un generador de código. Ejecutando qmake crea los metadatos para que cuando se construye su proyecto, sepa qué archivos moc, etc.

+1

Esto funcionó bien. Pero todavía no sé por qué funciona sin incluir el archivo .moc cuando coloco la parte de declaración en un archivo de encabezado separado. – Karsten

+2

Raramente necesita incluir explícitamente ningún archivo '.moc'. Qt maneja esto por ti. De hecho, el * único * tiempo que alguna vez lo he usado es al crear programas de muestra como el anterior, donde solo tienes un 'main.cpp'. Creo que la razón es que 'qmake' maneja automáticamente los archivos de cabecera de escaneo, pero no los archivos cpp, porque normalmente no contienen elementos que necesitan' moc'-ed. http://doc.qt.nokia.com/latest/moc.html –

3

creo que necesita para Moc el archivo e incluir la main.moc resultante en la parte inferior.

0

Creo que esto tiene algo que ver con QMake. No es que la aplicación ejecutable no pueda ver la clase DLL exportada. Es que el archivo obj para la clase no existe. Ejecutar QMake desde el menú Generar QT Creator y luego construir parece funcionar.

Why does this Simple Qt Application not link

0

que acabas de conocer el mismo problema, y ​​se ha resuelto cambiando el juego de caracteres de mi cabecera de Unicode a ANSI.

Cuestiones relacionadas