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