При работе с QObject, очень просто получить такое:
1. no matching function for call to 'QObject::connect(...)'
2. undefined reference to 'vtable for MyClass'
3. collect2: ld returned 1 exit status
Последняя ошибка на первом месте моего хит-парада неприятных ошибок :)
Итак, если мы хотим использовать объект QObject, нужно не забывать:
- Определять классы, использующие макрос Q_OBJECT в заголовочном файле (а не cpp). Иначе схлопочем ошибки 1 и 3.
- Вставлять макроса Q_OBJECT (Ошибка 1). Примечание: если собрать проект без этого макроса, потом вставить его и опять попробовать собрать, то можно получить ошибки 2 и 3. Нужно произвести чистку проекта (или тупо грохнуть папку с билдом. В QT Creator она по умолчанию-MyProject-build-desktop)
- Наследоваться от QObject, или его производного класса (Ошибка 1).
- Вставлять #include
. Ошибки можно и не получить, но сигналы и слоты работать не будут. - Определять объявленные слоты, если не хотим получить ошибку 3. С этим я конкретно намучался. "collect2: ld returned 1 exit status" и все! Ну как тут понять, что я просто забыл написать тело для слота MyClass::mySlot(){/* */}
- Определять объявленные слоты, если не хотим получить ошибку 3. С этим я конкретно намучался. "collect2: ld returned 1 exit status" и все! Ну как тут понять, что я просто забыл написать тело для слота MyClass::mySlot(){/* */}
UPD (7.08.10 18:25):
Блин, мне было нужно смотреть консоль сборки (QT Creator). Я бы сразу увидел дополнительную информацию о причинах ошибки.
Странно, у меня перед collect/ld всегда пишется, какой именно функции не хватает.
ОтветитьУдалитьИ vtable легко лечится полной пересборкой make clean && make
Проверил на QT 4.6.3, MinGW, если просто объявить слот, то "collect 2...", без пояснений. На необъявленную функцию (не слотовою) не ругается, если мы не будем ее вызывать, в противном случае та же ошибка.
ОтветитьУдалитьПопробуйте пересобрать проект. Мне помогло. (очистить - собрать).
ОтветитьУдалитьИтак, если мы хотим использовать объект QObject, нужно не забывать:
ОтветитьУдалитьОпределять классы, использующие макрос Q_OBJECT в заголовочном файле (а не cpp). Иначе схлопочем ошибки 1 и 3.
ЩИТО!?!?
Q_OBJECT необходим для moc для сбора метаинформацииа а именно: иформация о классе, напследовании, слотах и сигналов, для реализации тех же слотов и сигналов, свойств, транслитерации и поддержки qt скрипт
СПАСИБО!!!! Оч помогло с Ошибка 3
ОтветитьУдалить