Вопрос
Я занимаюсь разработкой простого приложения на 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, вы можете получить эту ошибку, если предыдущее развертывание не удалось по какой-то причине (например, приложение уже запущено). В этом случае просто выполните «Очистить проект», а затем «Восстановить проект», а затем «Выполнить» для развертывания.
Другие советы
Если у вас есть файл заголовка, выполните следующие действия:
<Ол>Это очистит старые ссылки и соберет их с помощью макроса 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.