在 QML 应用程序中使用预编译插件(通过共享库)

Use a precompiled plugin (via a shared library) in a QML application

我有一个由 another project 编译的 QML 插件(.so)。我想在我自己的 QML 应用程序中重新使用它,而不是每次都重新构建它。我想复制 .so 并用最少的附加代码编写:

import QQuickMapboxGL 1.0

在我的 QML 文件的顶部让它工作。

在我的QML项目中我需要在哪里复制.so,我需要如何将它添加到项目中以便QML运行时可以找到它?


我尝试过的:

  1. 创建一个 QQuickMapboxGL 目录,其中包含 libqmapboxgl.so
  2. 在该目录中创建一个 qmldir 文件,内容如下:

    plugin qmapboxgl
    
  3. 将以下内容添加到我的 .pro 文件中:

    INSTALL_DIR = $$PWD/../install
    target.path = $$INSTALL_DIR
    
    # Copy the QQuickMapboxGL folder to the install directory
    plugin.files = QQuickMapboxGL/*
    plugin.path  = $$INSTALL_DIR/QQuickMapboxGL
    
    INSTALLS += target plugin
    
  4. 添加一个 make install 构建步骤。

这次疯狂黑客攻击的结果是:

plugin cannot be loaded for module "QQuickMapboxGL": Plugin verification data mismatch in '/my/build/QQuickMapboxGL/libqmapboxgl.so'

我已验证该插件和我的应用程序都是使用相同版本的 g++ (g++-5 (Ubuntu 5.4.1-2ubuntu1~14.04) 5.4.1 20160904) 和相同的 Qt 下载 (5.7.0) 编译的。

主要问题是 .so 不是 QML 插件;没有 class 继承自 QQmlExtensionPlugin 或相关。它只是一个共享代码库。

能够通过以下方式解决此问题:

  • 将 MapboxGL 的头文件添加到我的项目中
  • 在我的 main.cpp 中:
    • #include "3rdparty/mapbox-gl-native/platform/qt/include/qmapbox.hpp"
    • 正在调用 QMapbox::registerTypes();(在 main 内)
  • 复制 libmapboxgl.so(通过 Mapbox 的 make/cmake 构建)到 libs 目录中。
  • myproject.pro中加入:LIBS += -L./libs -lqmapboxgl
  • 在我的 QML 代码中 import QQuickMapboxGL 1.0 然后使用 MapboxMap
  • 正在将 libmapboxgl.so 复制到 LD_LIBRARY_PATH
  • 引用的某个地方