Вопрос

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

  

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

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

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

Должно быть, что-то пропущено в сломанном классе, но я не могу его обнаружить.

Это было полезно?

Решение

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

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

<Ол>
  • Файл заголовка для класса MyDialog.h не добавляется в заголовки в файле qmake.

  • Вы запустили qmake для генерации файла make перед тем, как добавить макрос Q_OBJECT. Это создало файл make без правил moc. Это легко исправить, просто снова запустив qmake.

  • Ваш диалог имеет несколько классов, и QDialog - не первый класс, из которого он получен. Чтобы qmake работал правильно, базовый класс, производный от QObject, должен быть первым унаследованным классом.

  • Если вы используете Qt Creator, вы можете получить эту ошибку, если предыдущее развертывание не удалось по какой-то причине (например, приложение уже запущено). В этом случае просто выполните «Очистить проект», а затем «Восстановить проект», а затем «Выполнить» для развертывания.

  • Другие советы

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

    <Ол>
  • Щелкните правой кнопкой мыши проект, в который вы добавили это.
  • Нажмите "Run qmake".
  • Это очистит старые ссылки и соберет их с помощью макроса Q_OBJECT. QT не делает этого при перестроении.

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

    Чтобы решить эту проблему, я поместил Q_OBJECT в .h класса, а затем щелкнул правой кнопкой мыши на " Источники " - & GT; " Добавить существующие файлы ... " выбрав .ccp моего модифицированного класса.

    Вы используете qmake? Возможно, вы не добавили его в свой файл .cpp в файл SOURCES, а файл .h в переменную HEADERS в файле qmake?

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

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

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

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

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top