Подтвердить что ты не робот

Qt и файл moc _ *. Cpp

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

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

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

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

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

4b9b3361

Ответ 1

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

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

  • Заголовочный файл для класса MyDialog.h не добавляется в HEADERS в файле qmake.

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

Используете ли вы qmake? Возможно, вы не добавили его в свой .cpp файл в ваши ИСТОЧНИКИ и .h файл к вашей переменной HEADERS в файле qmake?

Ответ 5

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

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

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

Ответ 6

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