Не найден файл moc

Обновлено: 04.07.2024

Система слотов сигналов и атрибутов Qt основана на способности интроспекции во время выполнения. Так называемая интроспекция относится к способности объектно-ориентированного языка запрашивать информацию об объектах во время выполнения. Например, если язык имеет возможность проверять типы объектов во время выполнения, Затем это введение типа, которое можно использовать для реализации полиморфизма.
Интроспекция C ++ относительно ограничена и поддерживает только самоанализ типов. Самоанализ типа C ++ достигается с помощью ключевых слов typeid и dynamic_cast в информации о типах времени выполнения (RTTI).
Qt расширяет механизм интроспекции C ++, но не использует RTTI C ++, но предоставляет более мощный механизм метаобъектов для реализации механизма интроспекции. На основе механизма интроспекции вы можете перечислить методы и свойства объекта, а также получить всю информацию об объекте, например, типы параметров. Без механизма самоанализа трудно реализовать QtScript и QML.
Полное название метаобъектной системы в Qt - мета-объектная система, которая является расширением, основанным на стандартном C ++, которое предоставляет Qt механизм сигналов и слотов, информацию о типах в реальном времени и систему динамических атрибутов. Система метаобъектов основана на классе QObject, макросе Q_OBJECT и компиляторе метаобъектов MOC.
A, QObject класс
В качестве базового класса для каждого класса, который должен использовать систему метаобъектов.
B, макрос Q_OBJECT
Сегмент частных данных, определенный в каждом классе, используется для включения функций метаобъектов, таких как динамические атрибуты, сигналы и слоты.
В классе QObject или его производных классах, если макрос Q_OBJECT не объявлен, то объект метаобъекта класса не будет сгенерирован. Объект метаобъекта родительского класса, возвращенный экземпляром класса, вызывающим metaObject (), является результатом экземпляра класса Полученные метаданные фактически являются данными родительского класса. Следовательно, сигналы и слоты, определенные и объявленные классом, не могут быть использованы.Поэтому любой класс, унаследованный от QObject, независимо от того, определены или объявлены сигнал, слот и атрибут, должен объявлять макрос Q_OBJECT.
C. MOC (совместимость метаобъектов),
MOC анализирует исходный файл C ++. Если он обнаруживает, что определение макроса Q_OBJECT включено в файл заголовка, он динамически генерирует исходный файл C ++ с именем moc_xxxx. Исходный файл содержит код реализации Q_OBJECT, который будет скомпилирован и связан с классом В двоичном коде, как неотъемлемая часть класса.

2. Функция мета-объектной системы

3. Использование Q_PROPERTY ()

Q_PROPERTY определен в файле /src/corelib/kernel/Qobjectdefs.h и используется для обработки MOC.

Тип: тип атрибута
Имя: имя атрибута.
ПРОЧИТАЙТЕ getFunction: функция доступа к атрибутам
WRITE setFunction: функция установки атрибута
RESET resetFunction: сбросить функцию свойства
NOTIFY notifySignal: сигнал notifySignal, испускаемый при изменении атрибута
REVISION int: версия атрибута, атрибут предоставляется QML
DESIGNABLE bool: отображается ли свойство в дизайнере графического интерфейса пользователя, значение по умолчанию - true.
SCRIPTABLE bool: Может ли скриптовый движок получить доступ к атрибуту, по умолчанию - true.
STORED bool:
USER bool:
CONSTANT: указывает, что значение атрибута является константой, а атрибут с постоянным значением не имеет WRITE или NOTIFY.
ОКОНЧАНИЕ: атрибуты идентификации не будут перезаписаны производными классами.
Примечание. NOTIFY notifySignal объявляет, что сигнал notifySignal испускается при изменении атрибута, но он не реализован, поэтому программисту необходимо испустить сигнал notifySignal при изменении атрибута.
Object.h:

4. Использование Q_INVOKABLE

Qt ——Qt

Приведенный выше код вызывает метод deleteFile () объекта хранилища файлов через метод invokeMethod, предоставленный метаобъектом службы. Клиенту не нужно знать тип объекта, поэтому нет ссылки на конкретную библиотеку службы. Конечно, метод deleteFile на стороне сервера должен быть помечен как Q_INVOKEBLE, чтобы его распознала метаобъектная система.
Одним из основных достоинств сервисной инфраструктуры Qt является то, что она поддерживает межпроцессное взаимодействие, и сервис может принимать удаленные процессы. После регистрации в диспетчере служб процесс обменивается данными через сигнал, слот, вызываемый метод и свойство, как локальный объект. Службы могут быть разделены между клиентами или для одного клиента. До запуска сервисной инфраструктуры Qt сигналы, слоты и вызываемые методы поддерживали только перекрестные потоки. На следующем рисунке представлена ​​схематическая диаграмма межпроцессного взаимодействия службы и клиента. Вызываемый метод и Q_INVOKEBLE являются важными инструментами для обмена данными между городами и между потоками.

Во-вторых, анализ исходного кода метаобъектной системы Qt

1. Определение макроса Q_OBJECT

Любой класс, производный от QObject, содержит свою собственную модель метаданных, которая обычно определяется макросом Q_OBJECT.
Q_OBJECT определен в файле /src/corelib/kernel/Qobjectdefs.h.

2. Тип QMetaObject

Класс QMetaObject определен в файле /src/corelib/kernel/Qobjectdefs.h.

В QMetaObject есть вложенная структура, которая инкапсулирует все данные:
const QMetaObject superdata; // Метаданные базового класса класса, представленного метаданными
const char
stringdata; // Подпись метаданных
const uint * data; // указатель на индексный массив метаданных
const QMetaObject ** extradata; // Указатель на расширенную таблицу метаданных, указывающий на структуру данных QMetaObjectExtraData.

static_metacall - это указатель функции на Object :: qt_static_metacall.

3. Определение макроса QT_TR_FUNCTIONS

Макрос QT_TR_FUNCTIONS связан с переводом.

4. Определение других макросов в Qt

Qt определяет большое количество макросов в файле /src/corelib/kernel/Qobjectdefs.h.

Большинство макросов в Qt не имеют фактических определений и предназначены для обработки распознавания MOC.Утилита MOC генерирует файлы moc_xxx.cpp, анализируя макросы в классе.
В Qt4 и предыдущих версиях сигналы расширены до защищенных. Qt5 становится общедоступным для поддержки нового синтаксиса.

В-третьих, компилятор метаобъектов MOC

1. Функция MOC

A. Обработайте макрос Q_OBJECT и ключевые слова сигналов / слотов для генерации основного кода сигналов и слотов.
Б. Обработка Q_PROPERTY () и Q_ENUM () для генерации кода системы свойств
C. Обработка Q_FLAGS () и Q_CLASSINFO () для генерации дополнительной метаинформации класса
D. Коды, не требующие обработки MOC, могут быть заключены в предопределенные макросы, как показано ниже:

2. Ограничения MOC

A. Классы шаблонов не могут использовать механизм сигнала / слота
B. MOC не расширяет макросы, поэтому макросы нельзя использовать в определении сигналов и слотов, включая имена и параметры сигналов и слотов при подключении.
C. При наследовании от нескольких классов первым должен быть помещен производный класс QObject. Когда QObject (или его подклассы) является одним из родительских классов множественного наследования, его нужно разместить первым. Если используется множественное наследование, moc предполагает, что первый унаследованный класс является подклассом QObject при обработке, и должен гарантировать, что первым унаследованным классом является QObject или его подклассы.
D. Указатели функций нельзя использовать в качестве параметров сигналов или слотов, потому что формат более сложный и MOC не может их обрабатывать. Вы можете использовать typedef, чтобы определить его в простой форме и использовать снова.
E. При использовании перечислимых типов или типов typedef в качестве параметров для сигналов и слотов они должны быть полностью квалифицированы. Я не знаю, как перевести это слово на китайский язык. Проще говоря, если оно определено в классе, вы должны добавить путь к классу или путь к пространству имен во избежание путаницы. Например, Qt :: Alignment, предыдущий Qt является квалификатором Alignment, который необходимо добавить, и есть несколько уровней плюс несколько уровней.
F. Сигналы и слоты не могут возвращать ссылочные типы
Области ключевых слов G, сигналы и слоты могут быть помещены только в определение сигналов и слотов и не могут быть помещены в другие определения, такие как переменные и конструкторы.Объявления друзей не могут находиться в области объявления сигналов или слотов.
H. Вложенные классы не могут содержать сигналы и слоты.
MOC не может обрабатывать сигналы и слоты во вложенных классах. Примеры ошибок:
class A:public QObject
Q_OBJECT
public:
class B
public slots: // Неправильное использование

>;
I. Сигнальный слот не может иметь параметры по умолчанию

Я пытаюсь построить пример qtestlib/tutorial1, но файл testqstring.moc не генерируется при запуске nmake (я запускаю Qt 4.5.2 на Windows XP SP3).
Я скопировал testqstring.cpp из каталога учебника в свой каталог сборки (C:\sandboxes\testqstring) и из командной строки Qt запустил файл vsvars32.bat из моей установки MS Visual Studio 8, чтобы добавить переменные среды VS.

Согласно учебнику, я должен бежать:

Когда я это делаю, выход из nmake равен:

C:/Apps/Qt/2009.03/qt/bin\moc.exe -DUNICODE -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_TESTLIB_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT-I". \Apps\Qt\2009.03\qt\include\QtCore "- I". \Apps\Qt\2009.03\qt\include\QtGui "- I". \Apps\Qt\2009.03\qt\include\QtTest "- I". \Apps\Qt\2009.03\qt\include "- I". \Apps\Qt\2009.03\qt\include\ActiveQt"- I "debug" - I". \Apps\Qt\2009.03\qt\mkspecs\win32-g++" -D _ _ GNUC_ _ - DWIN32 testqstring.cpp-o debug\testqstring.moc

г++ -c -г -frtti -fexceptions -mthreads -стены -DUNICODE -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_TESTLIB_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -я". \Apps\Qt\2009.03\qt\include\QtCore" -я". \Apps\Qt\2009.03\qt\include\QtGui" -я". \Apps\Qt\2009.03\qt\include\QtTest" -я". \Apps\Qt\2009.03\qt\include" я"." -Я". \Apps\Qt\2009.03\qt\include\ActiveQt" -я"отладки" -я". \Apps\Qt\2009.03\qt\mkspecs\win32-g++" -о debug\testqstring.o testqstring.cpp

testqstring.cpp:63:27: testqstring.moc: такого файла или каталога нет
NMAKE: фатальная ошибка U1077: 'C:\Apps\Qt\2009.03\mingw\bin\g++.EXE' : код возврата '0x1' Остановка.
NMAKE: фатальная ошибка U1077: 'C:\PROGRA

3\VC\BIN\nmake.exe' : код возврата '0x2' Остановка.

Итак, я вижу, что moc.exe вызывается для генерации debug/testqstring.moc, но этот файл никогда не генерируется.

Спасибо вам за любое руководство, которое вы можете дать.

Я пытаюсь выяснить, в чем разница между moc.exe (Qt meta object compiler) в соответствующей 32-битной и 64-bit подпапке Qt5. Имеет ли какое-либо значение, если я позволю моему приложению с целевой архитектурой 64-Bit быть построенным (и обработанным) 32-битной или 64-Bit moc.exe версией? Я не смог.

Я пытался построить проект QT в QT Creator, но получал ошибки ссылок: minecraftlauncher.obj : error LNK2001: unresolved external symbol public: virtual struct QMetaObject const * __cdecl Launcher::MinecraftLauncher::metaObject(void)const .

Похоже, вы пытаетесь использовать nmake для сборки с MinGW. nmake - это инструмент MSVC.

Если вы хотите сделать сборку с MinGW, вы должны использовать mingw32-make . Если вы хотите сделать сборку с MSVC, вы должны использовать Qt, построенный с MSVC (что означает, что вы должны построить его самостоятельно или иметь коммерческую лицензию).

У меня была проблема с тем, что moc.exe не генерировал никаких moc-файлов с помощью nmake. Причиной был неправильный путь moc.exe внутри Makefile.Debug.

и теперь это работает. ;)

К сожалению, qmake будет генерировать файлы Makefile каждый раз, когда вы запускаете его из меню или перестраиваете/очищаете solution/project. я думаю, что это ошибка конфигурации qmake.

Для меня это было в C:\Qt\2009.03\qt\mkspecs\win32-msvc2008\qmake.conf

Найдите фразу "QMAKE_MOC". Вы найдете несколько таких строк:

QT_INSTALL_BINS-это путь, который кажется неправильным. Разделители каталогов по-прежнему являются'/', но должны быть '\'. На данный момент я точно не знаю, где мне нужно изменить QT_INSTALL_BINS. Но путь qt для меня не изменится, поэтому я заменил макрос на жестко определенные пути:

Теперь проблем с МОК больше нет. Перестроения тоже будут работать нормально.

Надеюсь, это поможет ;)

Пробовали ли вы использовать компилятор/инструменты, включенные в Qt in /mingw/bin? (в моей системе Qt установлен в C:\Qt\2009.03.) В последний раз, когда я проверял, некоммерческое распространение Qt не будет работать с Visual Studio. Я только что попробовал это сделать из командной строки Qt, и это сработало.

Надеюсь, это поможет.

Есть ли способ принудительно перекомпилировать файл moc других проектов? Я использую visual studio, и у меня есть один проект qt, где я добавил другой класс проекта с интерфейсом и сигналами / слотами (скажем, thing.cpp , thing.h , ui_thing.h (has been included generated files folder).

я использую QT Creator 1.3.1 и пытаюсь скомпилировать, но получаю эту ошибку. пожалуйста, помогите мне избавиться от него mingw32-make[1]: Leaving directory `C:/Documents and Settings/eyalk/My Documents/My QT Projects/XML' mingw32-make: Leaving directory `C:/Documents and Settings/eyalk/My.

Похожие вопросы:

Используя интеграцию Qt Visual studio, добавление нового класса Qt добавляет два отдельных сгенерированных файла moc.exe - один для отладки и один для выпуска (и один для любой другой существующей в.

Я пытаюсь скомпилировать небольшой пример базового макета тестового приложения в Qt, используя компилятор Visual Studio 2010 на Windows 7. Я использую cmake (2.8.4) и nmake для построения примера.

Я делаю плагин c++ для maya в качестве динамической библиотеки, используя VS2015, до сих пор я не использовал Qt5, но теперь мне нужна функциональность Q_Gadget и Q_Enum от Qt5.6.1, поэтому я начал.

Я пытаюсь выяснить, в чем разница между moc.exe (Qt meta object compiler) в соответствующей 32-битной и 64-bit подпапке Qt5. Имеет ли какое-либо значение, если я позволю моему приложению с целевой.

Я пытался построить проект QT в QT Creator, но получал ошибки ссылок: minecraftlauncher.obj : error LNK2001: unresolved external symbol public: virtual struct QMetaObject const * __cdecl.

Есть ли способ принудительно перекомпилировать файл moc других проектов? Я использую visual studio, и у меня есть один проект qt, где я добавил другой класс проекта с интерфейсом и сигналами /.

я использую QT Creator 1.3.1 и пытаюсь скомпилировать, но получаю эту ошибку. пожалуйста, помогите мне избавиться от него mingw32-make[1]: Leaving directory `C:/Documents and Settings/eyalk/My.

У меня большая проблема с прошлой недели, и я не могу найти никакого рабочего решения. Когда я компилирую Qwt 6.1.2 (и пытаюсь далее с 6.1.3 ) на консоли Windows 7 32bits с mingw32 и после.

У меня есть среда сборки, настроенная для группы проектов C++ на Visual Studio 2008, которые используют Qt. Мне уже давно не приходилось перекомпилировать код, но что-то, должно быть, изменилось в.

Я изменяю некоторые существующие проекты, которые используют QT (версия 5.10). Я обновляю их, чтобы использовать лучший, более краткий синтаксис msbuild (Target Visual Studio 2015) на windows. Один.

Практически каждый сталкивался с некоторыми проблемами при открытии неизвестных файлов при работе на компьютере. Это может быть очень сложно. Однако такие проблемы, не только с файлами MOC, могут быть решены стандартным способом. Следуйте инструкциям ниже, и мы можем гарантировать, что ваша проблема с открытием MOC будет решена!

MOC расширение файла

  • Тип файла MOCHA Java Script
  • Разработчик файлов N/A
  • Категория файла Файлы разработчика
  • Рейтинг популярности файлов

Как открыть файл MOC?

Если данная учетная запись пользователя не имеет необходимых разрешений для открытия файлов с расширением MOC , весьма вероятно, что в системе пользователей не установлена программа, поддерживающая данные файлы. Ниже приведен список действий, которые пользователь должен выполнить для решения наиболее распространенных проблем.

Шаг 1. Загрузите и установите приложение, которое поддерживает MOC файлы

После установки приложения система должна автоматически открывать MOC файлы с данным приложением. Ниже приведен список соответствующих программ, а также операционных систем, для которых они доступны:

Программы, поддерживающие MOC файлы

Windows

Шаг 2. Убедитесь, что файлы MOC связаны с соответствующим программным обеспечением

Возможно, что приложение, которое поддерживает файлы MOC, не связано с такими файлами. В этом случае программа должна быть вручную связана с файлами MOC (щелкните правой кнопкой мыши значок файла → СвойстваВкладка «Общие» → В подменю «Открыть с помощью» и нажмите кнопку «Изменить». Система отобразит список предлагаемых программы, которые поддерживают MOC файлы. Выберите приложение, установив флажок «Всегда использовать выбранное приложение для открытия файлов такого типа». Система сохранит эту информацию в своем реестре и будет использовать ее для открытия MOC файлов с выбранной программой. ,

Изменение MOC ассоциации файлов в реестре

Ассоциация файлов для файлов MOC может быть отредактирована вручную путем редактирования соответствующей записи в системном реестре Windows. Тем не менее, это не рекомендуется, так как это может привести к ошибкам в реестре, если это не сделано должным образом, и может даже повредить систему.

Кто-то написал GUI в дизайне Qt раньше, и теперь мне нужно изменить некоторые мелкие части (т.е. добавить кнопку/функциональность).

Предпосылка: Я добавляю новую функцию/вношу любые изменения в файл .ui в Designer. Я могу перейти в режим редактирования и увидеть, что это вносит изменения в xml-формат файла .ui

Проблема: Когда я строю и запускаю Qt, старая версия .ui - это то, что показано (без обновления моей функции). Я попробовал очистить все и запустить qmake, но безрезультатно.

Любые идеи, почему это может происходить?

ОТВЕТЫ

Ответ 1

У меня была такая же проблема, и она была решена, когда я отключил "Shadow Build" в режиме "Projects".

UPD: получение ответа за этот ответ меня расстраивает по двум причинам

  • это тривиально
  • проблема все еще там после почти 5 лет

Ответ 2

Я мог бы решить эту проблему без изменения конфигурации Shadow Build. В моем проекте я хочу построить с выходными файлами в build-ProjectName-Debug

Но QtCreator не является умным, чтобы проверить, не являются ли файлы moc_FileName.cpp и ui_FileName.h в каталог сборки. Эта проблема возникает из-за того, что если эти файлы moc_FileName.cpp и ui_FileName.h находятся в каталоге проекта, QtCreator использует их и не распознает изменения на .ui.

Решение этой проблемы было легко для меня: Удалите все moc_FileName.cpp и ui_FileName.h из каталога проекта и Перестроить. Эти файлы будут созданы в build-ProjectName-Debug, и все изменения будут там.

Ответ 3

Когда вы меняете файл .ui , кому-то нужно запустить uic.exe в файле для создания файла заголовка. Например, для окна с именем MyWindow.ui это создаст файл с именем ui_MyWindow.h .

Это то, что используется, когда приложение перестраивается.

Вы не указываете, как вы строите или на какой ОС, так что вам сложно помочь с этой целью. Если вы используете Visual Studios, вы можете интегрировать ваши файлы .ui в свои проекты, чтобы при изменении любого файла .ui все сгенерированные файлы будут воссозданы автоматически. То же самое можно сделать, если вы используете файлы .pri .

В любом случае я буду запускать:

Пожалуйста, измените имена файлов на те, которые вы используете. uic.exe можно найти в вашем каталоге Qt bin .

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

Ответ 4

Я решаю эту проблему на clean , затем build . Я считаю, что если я проверил Shadow Build , qtCreator будет использовать старый .obj, кроме генерации нового .obj, даже если ui_xxx.h был изменен, для генерации .exe при отладке agin. Моя среда - qt5.5 + msvc2013.

Ответ 5

Это то, что помогло мне лично, добавить в файл qmake: UI_DIR = $$PWD

Ответ 6

У меня была такая же проблема, и я смог ее решить, удалив все файлы Makefile в каталоге сборки, а затем перестроив с нуля. По некоторым причинам эти файлы не удаляются при запуске Clean Project из Qt Creator.

Ответ 7

Такая же проблема для меня. Ничего не работает, пока я не изменил установку с Qt 5.0.2 (MSVC 2010) на Qt 5.0.2 (mingw). Теперь он снова работает. проводной

Ответ 8

У меня возникла одна и та же проблема: после сборки никаких изменений ui не появилось. Проблема, упомянутая выше, заключается в том, что файлы ui не переделываются.

Устранение теневой сборки решило проблему для меня, но только один раз. После этого я не мог видеть последующие изменения ui снова. Поэтому я перепрофилировал теневую сборку и удалил существующую папку создания теневых файлов. Это работает последовательно, пока я удаляю все файлы сборки. Но это хромало. Он должен иметь возможность обнаруживать изменения ui и переделывать файлы.

Ответ 9

Я удалил весь файл автогенератора в исходной папке. когда я снял отметку с теневой сборки, в исходной папке был создан файл автогенератора. после того, как я проверил теневую сборку, компилятор использует только исходный файл gen. Поэтому я удалил весь файл автогенератора (ui_, moc_), а затем ui обновлялся всегда.

Ответ 10

Ответ 11

Вы играли с системной датой или временем, или они отличались от тех, что у вашего собеседника? Я изменил время на несколько часов спустя для целей тестирования (и тем временем компилировал проект), и после восстановления его в текущее время скомпилированные файлы не были обновлены, поскольку они были новее, чем время компиляции. Запуск Clean не удалил эти файлы. Снятие отметки с опции Shadow build только дало мне сбои и 0xc0000135 ошибку 0xc0000135 . Удаление вручную файлов moc _ *. O и *.cpp с будущей датой/временем из каталога сборки и повторная компиляция всего проекта было для меня решением.

Ответ 12

Как уже упоминалось выше, файлы ui не воссоздаются. Для меня самое простое решение - просто нажать "Реконструкция" вместо "Сборка". Не нужно каждый раз входить в подменю проекта. Пока ваш проект не слишком велик, все в порядке (кроме того, это анонимная ошибка, которая имеет долгие годы qt)

Читайте также: