TL; DR
Просто удалите папку build-xxx
и восстановите ее с нуля!
Context
Вам (почти) никогда не придется включать .moc
файл.Файлы Moc создаются автоматически компилятором moc
, компилируются и связываются в выделенном модуле перевода (т. Е. Как любой файл .cpp
).
Единственное исключение - это когда ваш класс QObject
объявлен вФайл cpp
(это ваш случай!), Потому что реализация .moc
по-прежнему требует компиляции вашего определения класса.Как предлагается в комментариях, здесь есть подробное объяснение здесь .
Потенциальные проблемы
Что касается вашей конкретной проблемы, moc
проблемы с файлами могут возникать из:
- ключевое слово
Q_OBJECT
отсутствует (но оно у вас есть).Этот токен используется для запуска генерации файла .moc
для этого конкретного класса.Без него большинство функций QObject отсутствуют. - класс был ранее проанализирован / скомпилирован без ключевого слова
Q_OBJECT
и кэширован как класс не-QObject.В этом случае вам просто нужно вручную удалить папку сборки (или запустить qmake
вручную), чтобы снова определить, какие классы должны быть moc
ed. - Вы используетенеправильное имя файла для вашего
moc
ed файла.Правильное имя обычно moc_filename.cpp
, когда ваш класс объявлен в заголовочном файле filename.moc
, когда ваш класс объявлен в исходном файле
qmake
фактически не анализирует ваш .cpp
файл.Это может быть в том случае, если ваш .pro
файл не включает его в переменную SOURCES
, или если вы просто никогда не запускаете qmake
(особые настройки и т. Д.)
ПримерMakefile
Вы можете дважды проверить, что ваши moc
файлы имеют соответствующие правила в Makefile своего проекта.Ниже приведен пример части Makefile:
compiler_moc_source_make_all: mysourcefile.moc
compiler_moc_source_clean:
-$(DEL_FILE) mysourcefile.moc
mysourcefile.moc: /home/aleravat/Qt/5.9.7/gcc_64/include/QtCore/QCoreApplication \
/home/aleravat/Qt/5.9.7/gcc_64/include/QtCore/qcoreapplication.h \
/home/aleravat/Qt/5.9.7/gcc_64/include/QtCore/qglobal.h \
/home/aleravat/Qt/5.9.7/gcc_64/include/QtCore/qconfig-bootstrapped.h \
# [...] more includes
/home/aleravat/Qt/5.9.7/gcc_64/bin/moc $(DEFINES) --include ./moc_predefs.h [...] mysourcefile.cpp -o mysourcefile.moc