Проблема с компоновщиком metaObject Qt
После интеграции Qt с Vs и попытки скомпилировать файл .pro, я получаю следующие ошибки:
Error 9 error LNK2001: unresolved external symbol "public: virtual int __thiscall Multiplication_dialog::qt_metacall(enum QMetaObject::Call,int,void * *)" ([email protected][email protected]@[email protected]@@[email protected])
Error 7 error LNK2001: unresolved external symbol "public: virtual struct QMetaObject const * __thiscall Multiplication_dialog::metaObject(void)const " ([email protected][email protected]@[email protected]@XZ)
Error 8 error LNK2001: unresolved external symbol "public: virtual void * __thiscall Multiplication_dialog::qt_metacast(char const *)" ([email protected][email protected]@[email protected])
Что с этим делать?
Ответы
Ответ 1
Вы обычно получаете эти ошибки, когда moc_foo.cpp для foo.h(который содержит ваш класс, помеченный как Q_OBJECT) не скомпилирован/не связан в вашем проекте.
Чтобы выполнить проект Qt в VS, вы либо
- Создайте файл .vcproj с помощью "qmake -tp vc" или
- Используйте надстройку Qt Visual Studio, которая автоматически обрабатывает все магии moc для вас (не работает с версиями VC Express).
При использовании надстройки вы можете инициировать создание moc_foo.cpp
- Убедитесь, что заголовочный файл рассматриваемого объекта отображается в проекте VS
- Элемент списка
- удалите все записи Q_OBJECT из файла заголовка Multiplication_dialog.
- сохранить файл
- добавить Q_OBJECT еще раз
- сохранить файл
Теперь у вас должна быть две версии moc_multiplication_dialog.cpp в папке "Сгенерированные файлы" в обозревателе решений. Один для "Debug" и один для "Release".
Убедитесь, что один из этих файлов не исключен из сборки.
Ответ 2
Сегодня я столкнулся с той же ошибкой компоновщика, но это произошло из-за небольшого скольжения:
Я добавил файлы cpp/ui в свой проект вручную, но забыл добавить файл заголовка явно как файл заголовка. Теперь при компиляции я получил аналогичное сообщение об ошибке, как указано выше, и файлы moc _ *. Cpp не были сгенерированы в каталоге отладки (или выпуска) сборки.
Это была не такая очевидная ошибка, qmake не жаловался, и кроме сообщения компоновщика у меня не было ошибок.
Итак, если кто-нибудь снова столкнется с той же проблемой (или сделает ту же ошибку копирования и ошибки):
убедитесь, что файлы заголовков также добавлены в файл проекта
Ответ 3
Цитата из книги "Программирование на С++ GUI с Qt 4" (стр. 19): Чтобы moc работал правильно, мы должны поместить определение класса в файл заголовка, отдельно от файла реализации.
Итак, вам нужно написать 2 файла для вашего класса: Multiplication_dialog.h и Multiplication_dialog.cpp! И вы должны воссоздать makefile!
Ответ 4
Хорошо Сегодня я столкнулся, вероятно, с той же проблемой. Я знаю, что поток довольно старый. Но он все равно может помочь кому-то.
Что случилось в моем случае: moc
генерировал файлы moc_ .cpp
, но VC не знает, что он тоже должен их скомпилировать. Поэтому я вручную добавлял эти файлы, сгенерированные moc, чтобы он компилировался. и это сработало.
Ответ 5
В настоящее время я работаю с VS 2013 с надстройкой QT 5.4. Создание проектов с надстройкой упрощает работу с автоматическим обработкой moc'ing. Чтобы предотвратить проблемы с ошибкой компоновщика с проблемами мета-объекта Qt:
-
Прокомментируйте все экземпляры Q_OBJECT во всех заголовочных файлах, которые содержат его в объявлениях классов.
-
Постройте решение
-
Раскомментируйте все экземпляры Q_OBJECT в файлах заголовков.
-
Восстановите решение. Здесь все все файлы заголовка и cpp повторно скомпилированы с автоматически выполненным moc'ing. Ошибки компоновщика, в свою очередь, позаботятся.
Ответ 6
Такая же проблема возникла, когда я использовал Qt Addin для VS, после сборки увидел файлы moc are not included into project
. Я включил их в проект, эти ошибки исчезли.
Ответ 7
Попробуйте перезапустить .pro вашего проекта.
Ответ 8
Некоторые довольно многословные объяснения выше.
Используя Qt Creator, в строке меню:
Build> Запустить qmake
Build> Build All