Добавление Q_OBJECT в мой класс дает неопределенную ссылку на `vtable - PullRequest
0 голосов
/ 02 июля 2019

У меня есть простой класс 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

1 Ответ

0 голосов
/ 02 июля 2019

Переименование OpenGlMaterialQtQuick.cpp в OpenGlMaterialQQuickItem.cpp (то есть имя класса) заставило его работать по неизвестным причинам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...