2011-11-23 14 views
6

Próbowałem napisać prostą aplikację Qt tak:Dlaczego ten prosty Qt aplikacji nie odwołuje

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

Ale kiedy próbowałem skompilować i połączyć je z Qt Creator 2.3.1 (Qt 4.7.4) mam 3 "nierozwiązanych zewnętrznych symbolu" błędy:

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

zmieniono "kompilacja" na "link", ponieważ nie jest to problem z kompilatorem. – stijn

Odpowiedz

12

Użyj poniższego kodu i upewnij się, że przed budowaniem uruchom qmake (Build> Run qmake).

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

Objaśnienie: Kiedy obejmują Q_OBJECT makro, to sygnalizuje Qt do zrobienia kilka rzeczy, które nie jest standard C++, takich jak sygnałów i slotów. Robi to, uruchamiając moc, który w dużej części jest generatorem kodu. Uruchamianie qmake tworzy metadane, aby po zbudowaniu projektu wiedział, które pliki mają być moc, itp.

+1

To zadziałało dobrze. Ale nadal nie wiem, dlaczego działa bez włączenia pliku .moc, kiedy umieszczam część deklaracji w oddzielnym pliku nagłówkowym. – Karsten

+2

Rzadko konieczne jest jawne dołączanie plików '.moc'. Qt obsługuje to za Ciebie. W rzeczywistości, jedyny * czas jaki kiedykolwiek użyłem to jest podczas tworzenia przykładowych programów, takich jak ten powyżej, gdzie masz tylko 'main.cpp'. Myślę, że powodem jest to, że 'qmake' automatycznie obsługuje pliki nagłówków skanowania, ale nie pliki cpp, ponieważ te zwykle nie zawierają rzeczy, które wymagają' moc' -ed. http://doc.qt.nokia.com/latest/moc.html –

3

Chyba trzeba MOC plik i obejmują wynikającą main.moc na dole.

0

Myślę, że ma to coś wspólnego z QMake. Nie chodzi o to, że aplikacja wykonywalna nie może zobaczyć wyeksportowanej klasy DLL. Chodzi o to, że plik obj dla klasy nie istnieje. Uruchamianie QMake z menu Build Buildera QT i budowanie wydaje się działać.

Why does this Simple Qt Application not link

0

Właśnie spotkał ten sam problem i został on rozwiązany przez zmianę zestawu znaków Unicode z moim nagłówku ANSI.

Powiązane problemy