2008-10-07 2 views
15

Я разрабатываю простое приложение Qt 4 и создаю свой собственный диалог. Я подклассы QDialog, вставил Q_OBJECT макрос в блоке декларации класса, и ... Я получаюQt и no moc _ *. Cpp file

[Linker Error] неопределенная ссылка на `виртуальные таблицы для MyDialog» и нет moc_MyDialog.cpp генерируется MOC компилятор.

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

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

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

ответ

30

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

+1

Я столкнулся с этим по другой причине: 5. Путь к файлу слишком длинный. Я испытал это главным образом на Windows, где часть системы здания ограничена древним 255-символьным пределом Windows. – 2012-05-20 19:47:39

0

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

0

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

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

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

3

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

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

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

1

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

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

0

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

Смежные вопросы