#c #qt #qt4
Вопрос:
Я разрабатываю простое приложение Qt 4 и создаю свой собственный диалог. Я создал подкласс QDialog
, вставил Q_OBJECT
макрос в блок объявления класса и… Я получаю
[Ошибка компоновщика] неопределенная ссылка на «vtable для MyDialog», и ее нет moc_MyDialog.cpp сгенерировано компилятором moc.
Я использую Qt 4.1.3 в Windows XP и mingw. Я следил за процессом сборки из поставляемой Qt оболочки сборки. Я использовал qmake для создания файлов make и скомпилировал все с помощью команды make.
У меня есть другие классы, которые относятся к подклассу QPushButton
и QObject
соответственно, но они компилируются нормально. Я не могу найти никаких различий между ними и сломанным.
Должно быть, в сломанном классе чего-то не хватает, но я не могу этого заметить.
Ответ №1:
Неопределенная ссылка на «vtable для 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, вы можете получить эту ошибку, если ваше предыдущее развертывание не удалось по какой-либо причине (например, приложение уже запущено). В этом случае просто выполните «Чистый проект», а затем «Перестройте проект», а затем «Запустите» для развертывания.
Комментарии:
1. Я столкнулся с этим по другой причине: 5. Путь к файлу слишком длинный. Я испытал это в основном на окнах, где какая-то часть строительной системы ограничена древним пределом в 255 символов для окон.
2. Также: отсутствие
QT = gui
в.pro
файле дает мне это преимущество с Qt 4.7.4.3. qmake ищет заголовки только в текущем каталоге, поэтому, если заголовок находится в другом каталоге, вы должны указать полный путь в ЗАГОЛОВКАХ.
4. полное имя пути должно быть там, т. е.: ЗАГОЛОВКИ = src/*.h не будет работать, вам нужны ЗАГОЛОВКИ = src/метафайл.h
Ответ №2:
Если у вас есть свой файл заголовка, выполните следующие действия:
- Щелкните правой кнопкой мыши на проекте, в который вы это добавили.
- Нажмите «Запустить qmake».
Это позволит очистить старые ссылки и построить с помощью макроса Q_OBJECT. QT не делает этого при перестроении.
Ответ №3:
Я вижу, что проблема возникает только тогда, когда добавляется класс без расширения, а затем расширение добавляется вручную.
Чтобы решить проблему, я поместил Q_OBJECT в .h класса, а затем щелкните правой кнопкой мыши на «Источниках» -> «Добавить существующие файлы…», выбрав .ccp моего измененного класса.
Ответ №4:
Вы используете qmake? Возможно, вы не добавили его в свой файл .cpp в ИСХОДНЫЕ файлы и файл .h в переменную ЗАГОЛОВКОВ в файле qmake?
Ответ №5:
Я смиренно предлагаю вам использовать CMake для создания программ Qt в Windows. Это позволит вам не забывать добавлять соответствующие файлы в свои файлы сборки.
Дополнительное значение заключается в том, что вы можете создавать файлы сборки make/nmake из него, файлы решений Visual Studio. И если вы скомпилируете Qt из исходного кода для Visual Studio, вы сможете как кодировать, так и создавать с помощью MS IDE/компилятора.
Это, конечно, если вы вообще используете Visual Studio.
Ответ №6:
Неопределенная ссылка на сообщение «vtable для MyDialog» также может быть результатом отсутствующей реализации (в MyDialog) чистой виртуальной функции в классе, из которого происходит MyDialog.