Всем добрый день.
Установил Qt 4.5.0 Commercial для MSVS 2008. Конфигурация по умолчанию. После успешной компиляции установил Qt Visual Studio Integration 1.4.3. После этого создаю Qt console application. Код приложения (пример из Assistant, раздел Signals and Slots):
C++ (Qt)
#include <QtCore/QCoreApplication>
class Counter : public QObject
{
Q_OBJECT
public:
Counter() { m_value = 0; }
int value() const { return m_value; }
public slots:
void setValue(int value);
signals:
void valueChanged(int newValue);
private:
int m_value;
};
void Counter::setValue(int value)
{
if (value != m_value) {
m_value = value;
emit valueChanged(value);
}
}
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
Counter a, b;
QObject::connect(&a, SIGNAL(valueChanged(int)),
&b, SLOT(setValue(int)));
a.setValue(12); // a.value() == 12, b.value() == 12
b.setValue(48); // a.value() == 12, b.value() == 48
return app.exec();
}
В результате чего возникает ошибка линковки:
C++ (Qt)
main.obj : error LNK2019: unresolved external symbol "protected: void __thiscall Counter::valueChanged(int)" (?valueChanged@Counter@@IAEXH@Z) referenced in function "public: void __thiscall Counter::setValue(int)" (?setValue@Counter@@QAEXH@Z)
1>main.obj : error LNK2001: unresolved external symbol "public: virtual struct QMetaObject const * __thiscall Counter::metaObject(void)const " (?metaObject@Counter@@UBEPBUQMetaObject@@XZ)
1>main.obj : error LNK2001: unresolved external symbol "public: virtual void * __thiscall Counter::qt_metacast(char const *)" (?qt_metacast@Counter@@UAEPAXPBD@Z)
1>main.obj : error LNK2001: unresolved external symbol "public: virtual int __thiscall Counter::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@Counter@@UAEHW4Call@QMetaObject@@HPAPAX@Z)
1>d:\projects\qt\qobject\Debug\qobject.exe : fatal error LNK1120: 4 unresolved externals
Первая ошибка, unresolved external, говорит о том, что я вызываю функцию, которая не определена. Но, насколько я знаю, код сигналов определять не нужно, обо всем заботится MOC. Следующие ошибки вообще мне не понятны.
Но если попробовать скомпилировать приложение, в котором отсутствуют явно сигналы и слоты, например:
C++ (Qt)
#include <QApplication>
#include <QLabel>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QLabel *label = new QLabel("Hello Qt!");
label->show();
return app.exec();
}
, то все работает отлично, приложение компилируется, собирается и запускается.
Я подозреваю, что дело именно в сигналах и слотах, но в чем именно - мне не понятно. Думал, что MOC не запускается, но ошибался. В Generated Files проекта появляется main.moc
Подскажите, в чем может быть дело.