2016-09-23 4 views
0

Работа над довольно большим фрагментом кода, написанным кем-то другим, и я не очень хорошо знаком с QT, но у меня не было успеха с недавней отладкой.QT build QWidget, ошибки QObject

После работы большой, я добавил 3 линии, а затем прокомментировал их все и при тестировании получили гораздо больше вариаций этих двух ошибок:

undefined reference to 'QObject::connectNotify(char const*)' (.rodata._ZTV15NumberWithUnits[_ZTV15NumberWithUnits]+0x60) undefined reference to 'QWidget::x11Event(_XEvent*) (.rodata._ZTV15NumberWithUnits[_ZTV15NumberWithUnits]+0x160)

Я думаю, что там могут быть некоторые библиотеку или другую ошибку сборки или очистку файлов, которые мне нужны, но я застрял.

После поиска и тестирования нескольких вещей я нашел несколько похожих ответов, таких как this one, и я пытался реализовать добавление -lqt-инструкции или фиксацию qmake.

Рекомендации относительно того, как это сделать, или других вещей, чтобы попробовать?

+1

Удалите папку сборки и перестройте проект ... –

+0

Ничего себе, простое исправление, которое сработало. У меня другие ошибки, которые, на мой взгляд, сейчас не связаны. Часто ли это происходит в среде QT? Любая идея о том, почему/когда я это вижу? – dusev

+0

Это потому, что вывод makefile - qmake - зависит от всех файлов. Qmake сканирует входные данные, но это немного замедлит сборку, если qmake пришлось перечитывать их каждый раз, когда любой из них изменился. Так что это не так. Это можно было бы зафиксировать с помощью функции backchitecting qmake, но при условии, что qmake как инструмент в конце жизни, для этого мало стимулов. Если вы хотите избежать этой проблемы, используйте 'qbs' (система сборки Qt) или' cmake' вместо этого. –

ответ

1

Qt полагается на несколько разных типов сгенерированных файлов, и если ваша система сборки, независимо от того, что она есть, не знает об этих зависимостях и не знает, чтобы сгенерировать файлы при внесении изменений, то вы «Будет много запутанных сообщений об ошибках, вызванных устареванием этих сгенерированных файлов.

В этом конкретном случае наиболее вероятным является устаревший файл «MOC» (метаобъектный компилятор). Эти файлы генерируются из include-файлов, содержащих макрос Q_OBJECT, и это созданная ими утилита moc.

Другие случаи включают в себя:

  • UI заголовки, которые генерируются из .ui (Qt Designer) файлы с помощью "UIC" полезность
  • файлы ресурсов (.cpp), которые образуются из .qrc с помощью утилиты «rcc».

В идеале, ваша система сборки будет иметь зависимостей, говорит, что сгенерированный файл MOC зависит от .h файла соответствия, который содержит макрос Q_OBJECT, и ваша система сборки затем запустить бы «МОС» вновь сгенерирован файл. Если ваша система сборки не делает этого, то у вас много разочарований.

+0

Спасибо за ответ. Я все равно не буду получать, как все это сделать. Я больше не могу запустить qmake и получить BIN-файл, сгенерированный всеми моими файлами .o после его удаления и восстановления и запуска qmake. У меня OBJECTS_DIR = ./BIN/ и MOC_DIR = ./BIN/ в моем .pro-файле, и я не могу понять, как избавиться от неопределенной ссылки сотен на 'QChar :: QChar (char) '..etc , ошибки. Я предполагаю, что это связано с этой ошибкой сборки, но по какой-то причине она больше не работает для меня. Мои попытки командной строки также были бесплодны. Мысли? – dusev