пятница, 6 августа 2010 г.

QT. QObject. Первые ошибки. Collect2: ld returned 1 exit status.

В связи со срочностью написания приложения на QT, была бегло пролистана соответствующая книжка. За эту спешку поплатился кучей глупых ошибок. Решил собрать коллекцию таких, на которые MinGW невразумительно ругается :)

При работе с 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(){/* */}


UPD (7.08.10 18:25):
Блин, мне было нужно смотреть консоль сборки (QT Creator). Я бы сразу увидел дополнительную информацию о причинах ошибки.

5 комментариев:

  1. Странно, у меня перед collect/ld всегда пишется, какой именно функции не хватает.

    И vtable легко лечится полной пересборкой make clean && make

    ОтветитьУдалить
  2. Проверил на QT 4.6.3, MinGW, если просто объявить слот, то "collect 2...", без пояснений. На необъявленную функцию (не слотовою) не ругается, если мы не будем ее вызывать, в противном случае та же ошибка.

    ОтветитьУдалить
  3. Попробуйте пересобрать проект. Мне помогло. (очистить - собрать).

    ОтветитьУдалить
  4. Итак, если мы хотим использовать объект QObject, нужно не забывать:


    Определять классы, использующие макрос Q_OBJECT в заголовочном файле (а не cpp). Иначе схлопочем ошибки 1 и 3.

    ЩИТО!?!?
    Q_OBJECT необходим для moc для сбора метаинформацииа а именно: иформация о классе, напследовании, слотах и сигналов, для реализации тех же слотов и сигналов, свойств, транслитерации и поддержки qt скрипт

    ОтветитьУдалить
  5. СПАСИБО!!!! Оч помогло с Ошибка 3

    ОтветитьУдалить

Можно использовать теги <b>, <i>