Karsten
Karsten

Reputation: 1866

Why does this Simple Qt Application not link

I tried to write a simple Qt application like this:

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

But when I tried to compile and link it with Qt Creator 2.3.1 (Qt 4.7.4) I get 3 "unresolved external symbol" errors:

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.

Upvotes: 8

Views: 10022

Answers (4)

Emilia
Emilia

Reputation: 1

I've just met the same problem, and it has been solved by changing the Character set of my header from Unicode to ANSI.

Upvotes: 0

narmaps
narmaps

Reputation: 413

I think this has something to do with QMake. It's not that the executable app can't see the exported DLL class. It's that the obj file for the class doesn't exist. Running QMake from the QT Creator Build menu and then building seems to work.

Why does this Simple Qt Application not link

Upvotes: 0

Dave Mateer
Dave Mateer

Reputation: 17946

Use the code below, and make sure to run qmake (Build > Run qmake) before building.

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

Explanation: When you include the Q_OBJECT macro, this signals Qt to do a bunch of stuff that is not standard C++, such as signals and slots. It does this by running moc, which in large part is a code generator. Running qmake creates the metadata so that when your project is built, it knows which files to moc, etc.

Upvotes: 13

Ahmish
Ahmish

Reputation: 1151

I think you need to moc the file and include the resulting main.moc at the bottom.

Upvotes: 3

Related Questions