У меня есть простой класс OpenGlMaterialQtQuick.cpp
, который дает конфликт с main.cpp
OpenGlMaterialQtQuick.h:
class OpenGlMaterialQQuickItem: public QQuickItem
{
Q_OBJECT
Q_PROPERTY(QString uri WRITE setUri)
public:
std::string uri;
QSGNode *updatePaintNode(QSGNode *node, UpdatePaintNodeData *) override;
OpenGlMaterialQQuickItem()
{
setFlag(ItemHasContents, true);
}
void setUri(const QString &a) {
uri = a.toStdString();
}
};
main.cpp:
int main(int argc, char **argv)
{
QGuiApplication app(argc, argv);
QCoreApplication::addLibraryPath("./");
qmlRegisterType<OpenGlMaterialQQuickItem>("OpenGlMaterialQQuickItem", 1, 0, "OpenGlMaterialQQuickItem");
QQuickView view;
view.setResizeMode(QQuickView::SizeRootObjectToView);
view.setSource(QUrl("qrc:/main.qml"));
view.show();
return app.exec();
}
Вот что я получаю в процессе связывания:
CMakeFiles/orwell.dir/main.cpp.o: In function `OpenGlMaterialQQuickItem::OpenGlMaterialQQuickItem()':
/home/lz/orwell/qt/../OpenGlMaterialQQuickItem.h:37: undefined reference to `vtable for OpenGlMaterialQQuickItem'
/home/lz/orwell/qt/../OpenGlMaterialQQuickItem.h:37: undefined reference to `vtable for OpenGlMaterialQQuickItem'
CMakeFiles/orwell.dir/main.cpp.o: In function `int qmlRegisterType<OpenGlMaterialQQuickItem>(char const*, int, int, char const*)':
/home/lz/Qt2/5.11.2/gcc_64/include/QtQml/qqml.h:285: undefined reference to `OpenGlMaterialQQuickItem::staticMetaObject'
/home/lz/Qt2/5.11.2/gcc_64/include/QtQml/qqml.h:287: undefined reference to `OpenGlMaterialQQuickItem::staticMetaObject'
CMakeFiles/orwell.dir/main.cpp.o: In function `OpenGlMaterialQQuickItem::~OpenGlMaterialQQuickItem()':
/home/lz/orwell/qt/../OpenGlMaterialQQuickItem.h:23: undefined reference to `vtable for OpenGlMaterialQQuickItem'
/home/lz/orwell/qt/../OpenGlMaterialQQuickItem.h:23: undefined reference to `vtable for OpenGlMaterialQQuickItem'
CMakeFiles/orwell.dir/main.cpp.o: In function `QtPrivate::MetaObjectForType<OpenGlMaterialQQuickItem*, void>::value()':
/home/lz/Qt2/5.11.2/gcc_64/include/QtCore/qmetatype.h:1448: undefined reference to `OpenGlMaterialQQuickItem::staticMetaObject'
CMakeFiles/orwell.dir/main.cpp.o: In function `QMetaTypeIdQObject<OpenGlMaterialQQuickItem*, 8>::qt_metatype_id()':
/home/lz/Qt2/5.11.2/gcc_64/include/QtCore/qmetatype.h:1804: undefined reference to `OpenGlMaterialQQuickItem::staticMetaObject'
CMakeFiles/orwell.dir/main.cpp.o:(.data.rel.ro._ZTVN11QQmlPrivate11QQmlElementI24OpenGlMaterialQQuickItemEE[_ZTVN11QQmlPrivate11QQmlElementI24OpenGlMaterialQQuickItemEE]+0x10): undefined reference to `OpenGlMaterialQQuickItem::metaObject() const'
CMakeFiles/orwell.dir/main.cpp.o:(.data.rel.ro._ZTVN11QQmlPrivate11QQmlElementI24OpenGlMaterialQQuickItemEE[_ZTVN11QQmlPrivate11QQmlElementI24OpenGlMaterialQQuickItemEE]+0x18): undefined reference to `OpenGlMaterialQQuickItem::qt_metacast(char const*)'
CMakeFiles/orwell.dir/main.cpp.o:(.data.rel.ro._ZTVN11QQmlPrivate11QQmlElementI24OpenGlMaterialQQuickItemEE[_ZTVN11QQmlPrivate11QQmlElementI24OpenGlMaterialQQuickItemEE]+0x20): undefined reference to `OpenGlMaterialQQuickItem::qt_metacall(QMetaObject::Call, int, void**)'
CMakeFiles/orwell.dir/main.cpp.o:(.data.rel.ro._ZTIN11QQmlPrivate11QQmlElementI24OpenGlMaterialQQuickItemEE[_ZTIN11QQmlPrivate11QQmlElementI24OpenGlMaterialQQuickItemEE]+0x10): undefined reference to `typeinfo for OpenGlMaterialQQuickItem'
collect2: error: ld returned 1 exit status
CMakeFiles/orwell.dir/build.make:305: recipe for target 'orwell' failed
make[2]: *** [orwell] Error 1
CMakeFiles/Makefile2:75: recipe for target 'CMakeFiles/orwell.dir/all' failed
make[1]: *** [CMakeFiles/orwell.dir/all] Error 2
Makefile:129: recipe for target 'all' failed
make: *** [all] Error 2
Все проблемы исчезнут, если я удалю Q_OBJECT
из класса.
Также, если я удалю qmlRegisterType<OpenGlMaterialQQuickItem>("OpenGlMaterialQQuickItem", 1, 0, "OpenGlMaterialQQuickItem");
, проблемы также исчезнут.
Самый близкий ответ, который я смог найти на эту проблему, это https://stackoverflow.com/a/3233952/6655884,, что говорит о том, что main.cpp каким-то образом переопределяет класс
Для полного файла OpenGlMaterialQtQuick.h:
https://github.com/lucaszanella/orwell/blob/a7c6ec41597ffd20ed2850039d6406af06b8429f/OpenGlMaterialQQuickItem.h
полный файл OpenGlMaterialQtQuick.cpp:
https://github.com/lucaszanella/orwell/blob/a7c6ec41597ffd20ed2850039d6406af06b8429f/OpenGlMaterialQtQuick.cpp
полный файл main.cpp:
https://github.com/lucaszanella/orwell/blob/a7c6ec41597ffd20ed2850039d6406af06b8429f/qt/main.cpp