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

Проблема с компоновщиком 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])    

Что с этим делать?

4b9b3361

Ответ 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