我有一个简单的类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文件:
完整的OpenGlMaterialQtQuick.cpp文件:
完整的main.cpp文件:
https://github.com/lucaszanella/orwell/blob/a7c6ec41597ffd20ed2850039d6406af06b8429f/qt/main.cpp
答案 0 :(得分:0)
将OpenGlMaterialQtQuick.cpp
重命名为OpenGlMaterialQQuickItem.cpp
(这是类名)使它可以出于未知原因工作。