Q ошибка компоновщика объектов!

при создании приложения я получаю следующую ошибку компоновщика.

HIMyClass.параметр obj:: ошибка: неразрешенный внешний символ " public: виртуальная структура QMetaObject const * __thiscall CHIMyClass:: метаобъект (void)const " (?метаобъект@CHIMyClass@ @ UBEPBUQMetaObject@ @ XZ) Файл не найден: HIMyClass.параметр obj

HIMyClass.параметр obj:: ошибка: неразрешенный внешний символ " public: виртуальная пустота * __thiscall CHIMyClass:: qt_metacast(char константа *)" (?qt_metacast@CHIMyClass@@UAEPAXPBD@Z) файл не найден: HIMyClass.параметр obj

HIMyClass.параметр obj:: ошибка: неразрешенный внешний символ " public: виртуальный int _ _ thiscall CHIMyClass:: qt_metacall(перечисление QMetaObject:: Call, int, void * *)" (?qt_metacall@CHIMyClass@@UAEHW4Call@QMetaObject@@HPAPAX@Z) файл не найден : HIMyClass.параметр obj

мое объявление класса похоже на

class CHIMyClass:public QDialog
{
   Q_OBJECT

   ....

};

когда я комментирую Q_OBJECT, ошибка компоновщика гаснет (и, очевидно, я не могу использовать сигналы и слоты). Я использую Qt Creator как IDE и Qt 4.5.3. Когда я даю Перестроить Все это точно qmake в будет называться. Я предполагаю, что проблема заключается в генерации файлов moc_*. Я использую Windows XP и cl в качестве компилятора.

какова может быть причина этой ошибки компоновщика?

10 ответов


такие ошибки обычно означают, что вы не добавили заголовок своего класса в переменную "HEADERS" в файле pro (компилятор meta object генерирует файлы moc_ только для заголовков, перечисленных в этой переменной). Не забудьте запустить qmake после изменения .про файл!


У меня была похожая проблема и она была решена с помощью обратной связи andref по. В Qt Creator я просто:

  1. создать/очистить все
  2. построить/запустить qmake
  3. Build / Run

С момента написания этого поста, я пересмотрел

я обнаружил, что мне нужно коснуться .pro файл перед восстановлением, т. е.

  1. добавить случайные символы
  2. сохранить
  3. удалить случайные символы
  4. сохранить
  5. Строительство

шаги 1-4, похоже, аннулируют любые старые файлы moc* forcing qmake чтобы восстановить их. В противном случае проект перестройки, похоже, использует устаревший moc* файлы.

[EDIT] обновленный ответ.

С момента написания этого поста я в значительной степени был clean, qmake затем build. The qmake важно, так как он воспроизводит MOC* файлы, которые вам нужны, если вы меняете свой .H-файлы и изменяя свое наследство в отношении Q_OBJECT. На самом деле, в некоторых случаях вы даже можете просто сделать qmake затем build для инкрементной сборки.


Проверьте файл MakeFile.debug а может быть HIMyClass не существует.

Я просто переименовать MakeFile.debug, очистить проект и перестроить все, и он компилируется.


У меня была та же проблема, но в моем случае этого было недостаточно, чтобы очистить -> построить. Поэтому мне пришлось вручную удалить все файлы, созданные в процессе сборки (Mekefiles, UI descriptionns в cpp и, как правило, весь каталог, созданный процессом сборки), и только тогда сборка прошла успешно.


проверьте, что необходимые параметры конфигурации Qt присутствуют в файле pro (QT += core gui по крайней мере. Также попробуйте вручную удалить все построенное / созданное в каталоге сборки. Иногда случается, что moc Не запускается по какой-то причине.

вы также можете попробовать запустить команду moc самостоятельно и посмотреть, что она выводит (вы можете найти командную строку на вкладке "компиляция вывода" в QtCreator.

обновление: этой по теме проблема кажется рекомендуется не определять QT_DLL при компиляции. Можете ли вы попробовать новый и новый простой проект QtCreator (с виджетом, который, например, подклассы mainwindow) и попробовать это. Он должен содержать заголовок Q_OBJECT автоматически и пытаться сравнить .pro файлы и выходные данные компилятора.


в моем окне osx это было связано с отсутствующими файлами moc*. я исправил это, удалив bom из моего кодированного utf-8 .pro файл. я подам ошибку с qt.

ошибка для поиска goggle... Примечание: отсутствующая vtable обычно означает, что первая не встроенная виртуальная функция-член не имеет определения.

"vtable for MainWindow", ссылка из:

 MainWindow::MainWindow(QWidget*)in mainwindow.o

Я нашел еще одну возможную причину и решение этой ошибки

эта ошибка также возникает, если один объявил слот .H файл, но не определил его тело в реализации


У меня была эта проблема. Проверьте, есть ли описание реализация слот .файл cpp.


Я удалил #include "main.moc" из моего основного файла и забыл его добавить... Это была забавная трата времени!