-1

I have a simple class OpenGlMaterialQtQuick.cpp that is giving a conflict with 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();
}

Here's what I'm getting in the linking process:

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

All the problems vanish if I remove Q_OBJECT from the class.

Also, if I remove qmlRegisterType<OpenGlMaterialQQuickItem>("OpenGlMaterialQQuickItem", 1, 0, "OpenGlMaterialQQuickItem"); the problems also disappear.

The closest answer I could find to this problem is https://stackoverflow.com/a/3233952/6655884, which suggests that main.cpp is redefining the class somehow

For a complete OpenGlMaterialQtQuick.h file:

https://github.com/lucaszanella/orwell/blob/a7c6ec41597ffd20ed2850039d6406af06b8429f/OpenGlMaterialQQuickItem.h

complete OpenGlMaterialQtQuick.cpp file:

https://github.com/lucaszanella/orwell/blob/a7c6ec41597ffd20ed2850039d6406af06b8429f/OpenGlMaterialQtQuick.cpp

complete main.cpp file:

https://github.com/lucaszanella/orwell/blob/a7c6ec41597ffd20ed2850039d6406af06b8429f/qt/main.cpp

PPP
  • 1,279
  • 1
  • 28
  • 71

1 Answers1

1

Renaming OpenGlMaterialQtQuick.cpp to OpenGlMaterialQQuickItem.cpp (which is the class name) made it work for unknown reasons.

PPP
  • 1,279
  • 1
  • 28
  • 71
  • 1
    Perhaps because it forced a proper rebuild. It sometimes happens that when I add Q_OBJECT to a class that previously does not have it, your error occurs. It is not detecting that moc must be run: see the "Run qmake" (or similar) in the Creator. Cleaning and rebuilding the project should solve this problem. –  Jul 02 '19 at 05:18
  • I only use cmake, not qmake or qt creator, and I cleaned every file produced from cmake and make several times, but who knows... – PPP Jul 02 '19 at 14:58