Qt and no moc _ *. Cpp file - PullRequest
       32

Qt and no moc _ *. Cpp file

16 голосов
/ 07 октября 2008

Я занимаюсь разработкой простого приложения на 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 соответственно, но они компилируются нормально. Я не могу найти никаких различий между ними и сломанной.

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

Ответы [ 6 ]

34 голосов
/ 07 октября 2008

Неопределенная ссылка на «vtable for 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, вы можете получить эту ошибку, если предыдущее развертывание не удалось по какой-то причине (например, приложение уже запущено). В этом случае просто выполните «Очистить проект», затем «Перестроить проект», а затем «Выполнить» для развертывания.

3 голосов
/ 17 мая 2012

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

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

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

1 голос
/ 07 июня 2012

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

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

0 голосов
/ 11 марта 2013

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

0 голосов
/ 08 октября 2008

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

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

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

0 голосов
/ 07 октября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...