Russian Qt Forum
Март 29, 2024, 17:54 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Qt 4.5.0 Commercial + MSVS 2008 Ошибка линковки при наличии сигналов и слотов  (Прочитано 6994 раз)
edain
Гость
« : Март 21, 2009, 17:12 »

Всем добрый день.

Установил 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

Подскажите, в чем может быть дело.
« Последнее редактирование: Март 21, 2009, 17:14 от edain » Записан
BRE
Гость
« Ответ #1 : Март 21, 2009, 17:37 »

Я подозреваю, что дело именно в сигналах и слотах, но в чем именно - мне не понятно. Думал, что MOC не запускается, но ошибался. В Generated Files проекта появляется main.moc
Класс Counter вытащи в counter.h и counter.cpp или в конец main.cpp добавь:
#include "main.moc"

Предполагаю, что происходит следующее:
main.moc компилируется в main.obj
и
main.cpp компилируется в main.obj
Соответственно затирая первый объектник.
Записан
edain
Гость
« Ответ #2 : Март 22, 2009, 12:00 »

BRE, спасибо большое, твой совет помог. Все заработало.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.104 секунд. Запросов: 20.