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 я просто:
- создать/очистить все
- построить/запустить qmake
- Build / Run
С момента написания этого поста, я пересмотрел
я обнаружил, что мне нужно коснуться .pro
файл перед восстановлением, т. е.
- добавить случайные символы
- сохранить
- удалить случайные символы
- сохранить
- Строительство
шаги 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 файл, но не определил его тело в реализации
Я удалил #include "main.moc"
из моего основного файла и забыл его добавить... Это была забавная трата времени!