Неразрешенных внешних символ "общественности: виртуальная структура 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)
21 ответов:
вы должны удалить
debugпапка вашего приложения и запустите его снова, чтобы исправить эту проблему.
Если вы используете Visual Studio, удалите строку
Q_OBJECTиз файла заголовка сохраните файл, поместитеQ_OBJECTвернитесь в файл заголовка, сохраните файл еще раз. Это должно генерироватьmoc_*файл и должен правильно строить и связывать.
я заметил, что некоторые ответы основаны на Visual Studio.
этот ответ основан на Qt Creator.
в отличие от названия,
Rebuild Projectне будет уничтожать все и строить с нуля. Если вы недавно добавилиQObject(и/или Q_OBJECT) к вашему классу, вы должны будете запуститьqmakeопять же, например,
- Очистить Проект
- запустить qmake
- Строительство
это потому, что по умолчанию
qmakeработает только когда вы делаете значительные изменения в своем решении, такие как добавление новых исходных файлов или изменение . Если вы вносите изменения в существующий файл, он не знает, что он должен работатьqmake.в качестве отступления, чтобы перебить Qt, чтобы построить все с нуля, удалите
Debugили .
Итак, проблема была в том, что мне нужен компилятор Qt MOC для компиляции моего .H-файл. Это необходимо для любых классов, которые расширяют QObject или один из его дочерних элементов. Исправление присутствие посторонних (для меня) правой кнопкой мыши на заголовке файла, выбрав "Свойства", и установив тип элемента "на Qt ввод Мос", затем нажать "компилировать" в заголовке, а затем добавить полученный moc_myfilename.cpp файл в мой проект.
Если ваши moc-файлы создаются в проекте visual studio, попробуйте включить их в проект, если они не включены в проект, а затем перестроить.
У меня была такая же проблема в Visual Studio, и решил ее следующим образом:
- щелкните правой кнопкой мыши файл заголовка в обозревателе решений
- свойства
- изменить "тип элемента" на "пользовательский инструмент сборки"
затем в пользовательской конфигурации инструмента сборки:
- перейти к генералу
установите "Командная строка" в:
" $(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"
установите "выходы" в:
.\GeneratedFiles\$(Имя_конфигурации)\moc_%(имя_файла).cpp
установите "дополнительные зависимости" в:
$(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 выглядит так:
- частный класс определен
- moc для публичного класса является #включенный.
- затем определяется реализация открытого класса.
это случилось со мной недавно при переключении с 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 компилирует отлично!
Comments