Usa*_*Ito 6 c++ shared-libraries qml qt5
我在QtCreator中使用项目模板"Libraries/Qt Quick 2 Extension Plugin"创建了一个测试插件作为Qt5/QML共享库.我的开发环境是使用Qt-5.0.0和QtCreator-2.6的linux(详细信息在底部附加).
源文件(在要点上):https://gist.github.com/4467883
源文件是默认生成的,没有任何更改.项目名称为"无标题",uri为"com.mycompany.mycomponents",对象类名为"MyItem"."/ tmp/untitled"中的源文件作为SRCDIR.
并将其构建为输出库文件"libuntitled.so","qmldir"和"/ tmp/untitled-build"中的一些目标文件作为DESTDIR.
$ ls /tmp/untitled-build
Makefile libuntitled.so moc_myitem.cpp
moc_myitem.o moc_untitled_plugin.cpp moc_untitled_plugin.o myitem.o
qmldir untitled_plugin.o
Run Code Online (Sandbox Code Playgroud)
但是,我不能使用 "/tmp/test/test.qml"中的库作为qmlscene命令的测试QML源.
$ mkdir /tmp/test; cd /tmp/test
$ vim test.qml
Run Code Online (Sandbox Code Playgroud)
"test.qml"(在要点上):https://gist.github.com/4474422
$ qmlscene test.qml
Run Code Online (Sandbox Code Playgroud)
它失败了,QML_IMPORT_TRACE日志是:
QQmlImportDatabase::addImportPath: "/usr/lib64/qt5/qml"
QQmlImportDatabase::addImportPath: "/usr/bin"
QQmlImports(file:///tmp/test/test.qml)::addImplicitImport
QQmlImports(file:///tmp/test/test.qml)::addLibraryImport: "QtQuick" 2.0 as ""
QQmlImports(file:///tmp/test/test.qml)::importExtension: loaded "/usr/lib64/qt5/qml/QtQuick.2/qmldir"
QQmlImportDatabase::importPlugin: "QtQuick" from "/usr/lib64/qt5/qml/QtQuick.2/libqtquick2plugin.so"
file:///tmp/test/test.qml:2 module "com.mycompany.mycomponents" is not installed
Run Code Online (Sandbox Code Playgroud)
并尝试"-I"选项:
$ qmlscene test.qml -I /tmp/untitled-build
Run Code Online (Sandbox Code Playgroud)
那也失败了.日志是:
QQmlImportDatabase::addImportPath: "/usr/lib64/qt5/qml"
QQmlImportDatabase::addImportPath: "/usr/bin"
QQmlImportDatabase::addImportPath: "/tmp/untitled-build"
QQmlImports(file:///tmp/test/test.qml)::addImplicitImport
QQmlImports(file:///tmp/test/test.qml)::addLibraryImport: "QtQuick" 2.0 as ""
QQmlImports(file:///tmp/test/test.qml)::importExtension: loaded "/usr/lib64/qt5/qml/QtQuick.2/qmldir"
QQmlImportDatabase::importPlugin: "QtQuick" from "/usr/lib64/qt5/qml/QtQuick.2/libqtquick2plugin.so"
file:///tmp/test/test.qml:2 module "com.mycompany.mycomponents" is not installed
Run Code Online (Sandbox Code Playgroud)
并尝试使用"/ tmp/test/qmldir":
$ vim /tmp/test/qmldir
Run Code Online (Sandbox Code Playgroud)
"tmp/test/qmldir"(在要点上):https://gist.github.com/4474497
那是失败的.日志:
QQmlImportDatabase::addImportPath: "/usr/lib64/qt5/qml"
QQmlImportDatabase::addImportPath: "/usr/bin"
QQmlImports(file:///tmp/test/test.qml)::addImplicitImport
QQmlImports(file:///tmp/test/test.qml)::importExtension: loaded "/tmp/test/qmldir"
QQmlImportDatabase::importPlugin: ".tmp.test" from "/tmp/untitled-build/libuntitled.so"
Module '.tmp.test' does not contain a module identifier directive - it cannot be protected from external registrations.
QQmlImports(file:///tmp/test/test.qml)::addLibraryImport: "QtQuick" 2.0 as ""
QQmlImports(file:///tmp/test/test.qml)::importExtension: loaded "/usr/lib64/qt5/qml/QtQuick.2/qmldir"
QQmlImportDatabase::importPlugin: "QtQuick" from "/usr/lib64/qt5/qml/QtQuick.2/libqtquick2plugin.so"
file:///tmp/test/test.qml:2 module "com.mycompany.mycomponents" is not installed
Run Code Online (Sandbox Code Playgroud)
如何在qmlscene(或qmlviewer5)的测试.qml("/ tmp/test.qml")中使用库("/ tmp/untitled-build/libuntitled.so")?
环境细节(基于openSUSE-12.2):
$ uname -a
Linux LH-MAIN 3.4.11-2.16-desktop #1 SMP PREEMPT Wed Sep 26 17:05:00 UTC 2012 (259fc87) x86_64 x86_64 x86_64 GNU/Linux
$ g++ --version | head -n1
g++ (SUSE Linux) 4.7.1 20120723 [gcc-4_7-branch revision 189773]
$ qmake -v
QMake version 3.0
Using Qt version 5.0.0 in /usr/lib64
$ qtcreator -version 2>&1 >/dev/null | grep "^[^ ].*" | head -n1
Qt Creator 2.6.1 based on Qt 5.0.0
$ qmlviewer5 -v
Qml debugging is enabled. Only use this in a safe environment!
Qt QML Viewer version 5.0.0
Run Code Online (Sandbox Code Playgroud)
参考文献:
尝试将您的文件plugin.so和qmldir文件放在一个文件夹中,例如:
- myproject
- imports
- com
- mycompany
- mycomponents
- libuntitled.so
- qmldir
Run Code Online (Sandbox Code Playgroud)
然后将imports目录添加到环境变量中QML2_IMPORT_PATH。
export QML2_IMPORT_PATH=/path/to/myproject/imports
这在我的 Linux 机器上对我有用。