Qt и нет файла moc_*.cpp

#c #qt #qt4

Вопрос:

Я разрабатываю простое приложение Qt 4 и создаю свой собственный диалог. Я создал подкласс QDialog , вставил Q_OBJECT макрос в блок объявления класса и… Я получаю

[Ошибка компоновщика] неопределенная ссылка на «vtable для MyDialog», и ее нет moc_MyDialog.cpp сгенерировано компилятором moc.

Я использую Qt 4.1.3 в Windows XP и mingw. Я следил за процессом сборки из поставляемой Qt оболочки сборки. Я использовал qmake для создания файлов make и скомпилировал все с помощью команды make.

У меня есть другие классы, которые относятся к подклассу QPushButton и QObject соответственно, но они компилируются нормально. Я не могу найти никаких различий между ними и сломанным.

Должно быть, в сломанном классе чего-то не хватает, но я не могу этого заметить.

Ответ №1:

Неопределенная ссылка на «vtable для MyDialog» вызвана отсутствием файла moc. Большинство компиляторов c создают определение vtable в объектном файле, содержащем первую виртуальную функцию. При создании подкласса объекта qt и использовании макроса Q_OBJECT это будет в файле moc*.cpp. Таким образом, эта ошибка означает, что файл moc отсутствует.

Возможные проблемы, о которых я могу подумать, заключаются в следующем:

  1. Файл заголовка для класса MyDialog.h не добавляется в ЗАГОЛОВКИ в файле qmake.
  2. Вы запустили qmake для создания файла make перед добавлением макроса Q_OBJECT. Это создало файл make без правил moc. Это легко исправить, просто запустив qmake еще раз.
  3. Ваш диалог происходит из нескольких классов, и QDialog не является первым классом, из которого он происходит. Чтобы qmake работал правильно, производный базовый класс QObject должен быть первым классом, от которого он унаследован.
  4. Если вы используете Qt Creator, вы можете получить эту ошибку, если ваше предыдущее развертывание не удалось по какой-либо причине (например, приложение уже запущено). В этом случае просто выполните «Чистый проект», а затем «Перестройте проект», а затем «Запустите» для развертывания.

Комментарии:

1. Я столкнулся с этим по другой причине: 5. Путь к файлу слишком длинный. Я испытал это в основном на окнах, где какая-то часть строительной системы ограничена древним пределом в 255 символов для окон.

2. Также: отсутствие QT = gui в .pro файле дает мне это преимущество с Qt 4.7.4.

3. qmake ищет заголовки только в текущем каталоге, поэтому, если заголовок находится в другом каталоге, вы должны указать полный путь в ЗАГОЛОВКАХ.

4. полное имя пути должно быть там, т. е.: ЗАГОЛОВКИ = src/*.h не будет работать, вам нужны ЗАГОЛОВКИ = src/метафайл.h

Ответ №2:

Если у вас есть свой файл заголовка, выполните следующие действия:

  1. Щелкните правой кнопкой мыши на проекте, в который вы это добавили.
  2. Нажмите «Запустить qmake».

Это позволит очистить старые ссылки и построить с помощью макроса Q_OBJECT. QT не делает этого при перестроении.

Ответ №3:

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

Чтобы решить проблему, я поместил Q_OBJECT в .h класса, а затем щелкните правой кнопкой мыши на «Источниках» -> «Добавить существующие файлы…», выбрав .ccp моего измененного класса.

Ответ №4:

Вы используете qmake? Возможно, вы не добавили его в свой файл .cpp в ИСХОДНЫЕ файлы и файл .h в переменную ЗАГОЛОВКОВ в файле qmake?

Ответ №5:

Я смиренно предлагаю вам использовать CMake для создания программ Qt в Windows. Это позволит вам не забывать добавлять соответствующие файлы в свои файлы сборки.

Дополнительное значение заключается в том, что вы можете создавать файлы сборки make/nmake из него, файлы решений Visual Studio. И если вы скомпилируете Qt из исходного кода для Visual Studio, вы сможете как кодировать, так и создавать с помощью MS IDE/компилятора.

Это, конечно, если вы вообще используете Visual Studio.

Ответ №6:

Неопределенная ссылка на сообщение «vtable для MyDialog» также может быть результатом отсутствующей реализации (в MyDialog) чистой виртуальной функции в классе, из которого происходит MyDialog.