Проблема компоновщика Qt metaObject - PullRequest
17 голосов
/ 10 июля 2011

После интеграции Qt с Vs и попытки скомпилировать .pro файл я получаю следующие ошибки:

Error   9   error LNK2001: unresolved external symbol "public: virtual int __thiscall Multiplication_dialog::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@Multiplication_dialog@@UAEHW4Call@QMetaObject@@HPAPAX@Z)     

Error   7   error LNK2001: unresolved external symbol "public: virtual struct QMetaObject const * __thiscall Multiplication_dialog::metaObject(void)const " (?metaObject@Multiplication_dialog@@UBEPBUQMetaObject@@XZ)  


    Error   8   error LNK2001: unresolved external symbol "public: virtual void * __thiscall Multiplication_dialog::qt_metacast(char const *)" (?qt_metacast@Multiplication_dialog@@UAEPAXPBD@Z)    

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

Ответы [ 7 ]

17 голосов
/ 10 июля 2011

Обычно вы получаете эти ошибки, когда moc_foo.cpp для foo.h (который содержит ваш класс, помеченный Q_OBJECT) не компилируется / не связывается в вашем проекте.

Чтобы проект Qt работал в VS, вы либо

  1. Создайте файл .vcproj с помощью 'qmake -tp vc' или
  2. Используйте надстройку Qt Visual Studio, которая автоматически обрабатывает всю магию moc (однако не работает с версиями VC Express).

При использовании надстройки вы можете запустить создание moc_foo.cpp с помощью

  • Убедитесь, что заголовочный файл рассматриваемого объекта появляется в проекте VS
  • Элемент списка
  • удалить все вхождения Q_OBJECT из заголовочного файла Multiplication_dialog.
  • сохранить файл
  • снова добавить Q_OBJECT
  • сохранить файл

Теперь у вас должно быть две версии moc_multiplication_dialog.cpp в папке «Generated Files» в обозревателе решений. Один для "Debug" и один для "Release". Убедитесь, что один из этих файлов не исключен из сборки.

14 голосов
/ 25 февраля 2014

Сегодня я столкнулся с той же ошибкой компоновщика, но это было из-за небольшого промаха:

Я вручную добавил файлы cpp / ui в свой проект, но забыл явно добавить файл заголовка в качестве файла заголовка.Теперь при компиляции я получил сообщение об ошибке, подобное приведенному выше, и файлы moc _ *. Cpp не были сгенерированы в каталоге отладки (или выпуска) сборки.Это не было такой очевидной ошибкой, qmake не жаловался, и кроме сообщения компоновщика, я не получил никаких ошибок.

Так что, если кто-то снова сталкивается с той же проблемой (или делает ту же ошибку копирования и переноса): убедитесь, что файлы заголовков также были добавлены в ваш файл проекта

6 голосов
/ 04 июля 2012

Цитата из книги "Программирование на C ++ GUI с использованием Qt 4" (стр. 19): чтобы moc работал правильно, мы должны поместить определение класса в заголовочный файл, отдельный от файла реализации.Итак, вам нужно написать 2 файла для вашего класса: Multiplication_dialog.h и Multiplication_dialog.cpp!И вы должны воссоздать make-файл!

4 голосов
/ 22 августа 2012

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

В моем случае moc генерировал файлы moc_ .cpp, но VC не знает, что он должен их компилировать Поэтому я вручную добавил эти сгенерированные moc файлы, чтобы он компилировался. и это сработало.

2 голосов
/ 05 мая 2015

В настоящее время я работаю с VS 2013 с надстройкой QT 5.4.Сборка проектов с помощью надстройки облегчает задачу, поскольку перемещение выполняется автоматически.Чтобы предотвратить проблемы ошибок компоновщика с проблемами метаобъекта Qt:

  1. Закомментируйте все экземпляры Q_OBJECT во всех заголовочных файлах, которые его содержат в объявлениях класса.

  2. Построение решения

  3. Раскомментируйте все экземпляры Q_OBJECT в заголовочных файлах.

  4. Перестройте решение.Это то место, где все все файлы заголовков и cpp перекомпилируются с moc'ing автоматически.Ошибки компоновщика, в свою очередь, устраняются.

1 голос
/ 25 декабря 2014

Та же проблема возникла, когда я использовал Qt Addin для VS, я увидел moc файлы are not included into project после сборки. Я включил их в проект, эти ошибки исчезли.

0 голосов
/ 11 июля 2019

Попробуйте перезапустить .pro вашего проекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...