Неразрешенных внешних символ "общественности: виртуальная структура QMetaObject константные * thiscall родителей



я унаследовал класс от QObject :



class Parent: public QObject
{
Q_OBJECT
QObject* cl;

public:
Parent(QObject *parent=0):QObject(parent) {
cl = NULL;
}

QObject* getCl() const {
return cl;
}
void setCl(QObject *obj) {
cl = obj;
}
};


но когда я пишу :



Parent ev;


Я получаю следующую ошибку:



main.obj:-1: error: LNK2001: unresolved external symbol "public: virtual struct QMetaObject const * __thiscall Parent::metaObject(void)const " (?metaObject@Parent@@UBEPBUQMetaObject@@XZ)

main.obj:-1: error: LNK2001: unresolved external symbol "public: virtual void * __thiscall Parent::qt_metacast(char const *)" (?qt_metacast@Parent@@UAEPAXPBD@Z)

main.obj:-1: error: LNK2001: unresolved external symbol "public: virtual int __thiscall Parent::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@Parent@@UAEHW4Call@QMetaObject@@HPAPAX@Z)
620   21  

21 ответов:

вы должны удалить debug папка вашего приложения и запустите его снова, чтобы исправить эту проблему.

Если вы используете Visual Studio, удалите строку Q_OBJECT из файла заголовка сохраните файл, поместите Q_OBJECT вернитесь в файл заголовка, сохраните файл еще раз. Это должно генерировать moc_* файл и должен правильно строить и связывать.

я заметил, что некоторые ответы основаны на Visual Studio.

этот ответ основан на Qt Creator.

в отличие от названия, Rebuild Project не будет уничтожать все и строить с нуля. Если вы недавно добавили QObject (и/или Q_OBJECT) к вашему классу, вы должны будете запустить qmake опять же, например,

  1. Очистить Проект
  2. запустить qmake
  3. Строительство

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

в качестве отступления, чтобы перебить Qt, чтобы построить все с нуля, удалите Debug или .

Итак, проблема была в том, что мне нужен компилятор Qt MOC для компиляции моего .H-файл. Это необходимо для любых классов, которые расширяют QObject или один из его дочерних элементов. Исправление присутствие посторонних (для меня) правой кнопкой мыши на заголовке файла, выбрав "Свойства", и установив тип элемента "на Qt ввод Мос", затем нажать "компилировать" в заголовке, а затем добавить полученный moc_myfilename.cpp файл в мой проект.

Если ваши moc-файлы создаются в проекте visual studio, попробуйте включить их в проект, если они не включены в проект, а затем перестроить.

У меня была такая же проблема в Visual Studio, и решил ее следующим образом:

  1. щелкните правой кнопкой мыши файл заголовка в обозревателе решений
  2. свойства
  3. изменить "тип элемента" на "пользовательский инструмент сборки"

затем в пользовательской конфигурации инструмента сборки:

  1. перейти к генералу
  2. установите "Командная строка" в:

    " $(QTDIR)\bin\moc.exe ""%(FullPath) " - o ".\GeneratedFiles\$(Имя_конфигурации)\moc_%(имя_файла).cpp" " - fStdAfx.h "" - f../../../ src/имя файла.h" -DUNICODE-DWIN32-DWIN64-DQT_DLL-DQT_NO_DEBUG-DNDEBUG-DQT_CORE_LIB-DQT_GUI_LIB-DQT_WIDGETS_LIB-DQT_NETWORK_LIB-DWIN32_LEAN_AND_MEAN-DDIS_VERSION=7-D_MATH_DEFINES_DEFINED "-I.\SFML_STATIC" "-I.\GeneratedFiles" "-I."- I$(qtdir)\Include ""- I.\GENERATEDFILES\$(ИМЯ_КОНФИГУРАЦИИ).""-Я$(QTDIR)\включать\необходимости некоторые" "-я$(QTDIR)\включать\QtGui пакет" "- I$(QTDIR)\include\QtNetwork"

  3. установите "выходы" в:

    .\GeneratedFiles\$(Имя_конфигурации)\moc_%(имя_файла).cpp

  4. установите "дополнительные зависимости" в:
    $(QTDIR)\bin\moc.exe;%(FullPath)


ваши точные значения могут быть разными. Они обычно применяются через плагин Qt.

Я использую CMake для управления проектами Qt, и новый Q_OBJECT должен быть добавлен под вызовом QT4_WRAP_CPP. Это будет генерировать moc_*.cxx для включения в проект и очистки нерешенных внешних факторов.

У меня была эта проблема с Visual Studio 2012, когда у меня было определение класса Q_OBJECT в моем файле cpp. Перемещение определения класса в файл заголовка решило проблему.

похоже, что можно поддерживать класс Q_OBJECT в файле cpp, добавив файл cpp в moc, но я этого не пробовал.

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

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

в моем случае (используя QtAdd-in с VS2012 и Qt v4.8.4) ни одно из приведенных выше предложений не сработало. По какой-то причине VS не смог создать правильные файлы moc (build output: соответствующие классы не найдены. Без выходных данных, генерируемых.) и когда я скомпилировал соответствующие заголовки вручную (установив qt moc в качестве компилятора и нажав "Compile"), он произвел пустой файл moc.

что действительно работало, так это компиляция всех необходимых mocs из командной строки (moc-o moc_SomeClass.cpp SomeClass.h) и после этого замените неправильное те, в папке GeneratedFiles.

Это только обходной путь (и не удобный для большого проекта), чтобы ваш проект был успешно построен, но на самом деле не объясняет странное поведение VS/QtAdd-in.

используя QtAdd-in с VS2010 я понял moc_*.файлы cpp были обновлены в папке GeneratedFiles/Debug, хотя я был в режиме выпуска. Копирование файлов в папку релиза работало для меня.

У меня была эта проблема с "частным классом". Qt использует эту модель, хотя из их кода. Мне самому это очень понравилось.

в принципе, у вас есть частный объявленный класс в определении класса открытого файла заголовка с указателем на его экземпляр в качестве члена данных открытого класса. (Примечание: Вы можете найти жизнь проще объявить его как класс друга тоже.)

затем создайте частную версию вашего класса в файле cpp для общедоступного. Делать Не создавайте файл заголовка для этого частного класса. Делать всю грязную работу с этим классом. Это скрывает всю реализацию вашего открытого класса, включая другие частные члены.

не объясняя, что дальше, вот точка, как это относится к этой теме. Чтобы получить работу Q_OBJECT, мне нужно было добавить это в cpp:

#include "MyPublicClass.moc"

макет cpp выглядит так:

  1. частный класс определен
  2. moc для публичного класса является #включенный.
  3. затем определяется реализация открытого класса.

это случилось со мной недавно при переключении с MingW на MSVC. У меня был прототип класса/структуры, указанный как класс, и MingW не возражал.

MSVC определенно видит разницу между class и struct когда речь идет о прототипировании.

надеюсь, что это поможет кому-то еще в один прекрасный день.

в моем случае ничего из вышеперечисленного не сработало, но это была полностью моя ошибка.

Я переопределил виртуальные функции .H файл (объявил их), но никогда не определял их.cpp:)

Я решил свою проблему, добавив это в мой файл заголовка:

#ifndef MYCLASSNAME_H
#define MYCLASSNAME_H

... // all the header file content.

#endif

любой ответ работает для меня в среде VS 2013. Я в конечном итоге решить эту проблему, удалив .h/.cpp из проекта и добавить его снова.

Я работаю в VS2015 с интегрированным клиентом Perforce p4v. В моем случае Perforce попытался добавить MOC-файл в depo, когда я вернул эту операцию, Perforce удалил этот moc-файл из проекта и удалил его. Файл был воссоздан после следующей компиляции, но он не был включен в проект, я должен добавить его вручную в сгенерированные файлы, когда я наконец понял, в чем проблема.

У меня та же проблема, мое решение было кодирование( мой файл с "UTF16LE BOM" не может генерировать с moc.exe), y создать другой файл с ASCII enconding и он работает.

HxD HexEditor может помочь вам увидеть кодификацию.

Я работаю в VisualStudio только с проектом C++, который имеет Qt-интерфейс. Просто удаление строки Q_OBJECT работает штрафы, чтобы удалить ошибки компоновщика. Кажется, не имеет никакого негативного эффекта.

Я знаю, что это очень старый вопрос, но он кажется все еще интересным (я был здесь по крайней мере 4 или 5 раз за последние месяцы) и, похоже, я нашел еще одну причину, по которой можно получить эту ошибку.

в моем случае в заголовочном файле я неправильно набрал:

#include "MyClass.h""

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

теперь, когда я удалил дополнительную кавычку мой QObject компилирует отлично!

для меня это причина: некоторый заголовок или исходный файл, не включенный в файл проекта QT

Comments

    Ничего не найдено.