• 6657阅读
  • 4回复

[提问]使用别人的静态构建Quick程序无法打开窗口 [复制链接]

上一主题 下一主题
离线彩阳
 

只看楼主 倒序阅读 楼主  发表于: 2014-08-29
如题。我使用realfan静态编译的Qt SDK,然后新建一个Quick程序,使用Release模式进行静态编译构建,成功。
但是在资源管理器(Explorer)上打开的程序就无法运行窗口。无奈,在Qt Creator上测试运行。结果出现这样的调试信息:

QQmlApplicationEngine failed to load component
qrc:///qml/main.qml:2 module "QtQuick.Controls" is not installed
qrc:///qml/main.qml:1 module "QtQuick" is not installed
qrc:///qml/main.qml:2 module "QtQuick.Controls" is not installed
qrc:///qml/main.qml:1 module "QtQuick" is not installed
有谁遇到过这样的情况吗?
上海Qt开发联盟,热忱地欢迎你的加入!
离线彩阳

只看该作者 1楼 发表于: 2014-08-29
前面一段时间看了Qt的博客,介绍了如何通过修改插件的代码来减少静态链接Qt插件的个数最后减少生成Qt程序的大小。
博客地址在这里:请点击我
我只成功了一半,自己静态编译的程序还是依赖Qt SDK中的qml文件夹。没法完全stand alone。
上海Qt开发联盟,热忱地欢迎你的加入!
离线彩阳

只看该作者 2楼 发表于: 2014-08-29
去qt-project.org论坛上问问。
http://qt-project.org/forums/viewthread/46795/
上海Qt开发联盟,热忱地欢迎你的加入!
离线彩阳

只看该作者 3楼 发表于: 2014-08-29
在上面的帖子中,我已经找到了一个通融的方法,虽然这样可能不友好。

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QtPlugin>
#include <QtQml>

#if defined(QT_STATIC) && !defined(Q_OS_MAC) && !defined(QT_NAMESPACE)
Q_IMPORT_PLUGIN(QtQuick2Plugin)
Q_IMPORT_PLUGIN(QtQuickControlsPlugin)
Q_IMPORT_PLUGIN(QtQuickLayoutsPlugin)
Q_IMPORT_PLUGIN(QtQuick2WindowPlugin)
#endif

int main( int argc, char* argv[] )
{
    QGuiApplication app( argc, argv );

    ……

    QQmlApplicationEngine engine;

    // 在静态编译下一个通融的解决方法是显式地注册QML类
#if defined(QT_STATIC) && !defined(Q_OS_MAC) && !defined(QT_NAMESPACE)
    qobject_cast<QQmlExtensionPlugin*>(qt_static_plugin_QtQuick2Plugin().instance())       ->registerTypes("QtQuick");
    qobject_cast<QQmlExtensionPlugin*>(qt_static_plugin_QtQuickControlsPlugin().instance())->registerTypes("QtQuick.Controls");
    qobject_cast<QQmlExtensionPlugin*>(qt_static_plugin_QtQuickControlsPlugin().instance())->registerTypes("QtQuick.Controls.Private");
    qobject_cast<QQmlExtensionPlugin*>(qt_static_plugin_QtQuickControlsPlugin().instance())->registerTypes("QtQuick.Controls.Styles");
    qobject_cast<QQmlExtensionPlugin*>(qt_static_plugin_QtQuickLayoutsPlugin().instance()) ->registerTypes("QtQuick.Layouts");
    qobject_cast<QQmlExtensionPlugin*>(qt_static_plugin_QtQuick2WindowPlugin().instance()) ->registerTypes("QtQuick.Window.2");

    qobject_cast<QQmlExtensionPlugin*>(qt_static_plugin_QtQuick2Plugin().instance())       ->initializeEngine( &engine, "QtQuick");
    qobject_cast<QQmlExtensionPlugin*>(qt_static_plugin_QtQuickControlsPlugin().instance())->initializeEngine( &engine, "QtQuick.Controls");
    qobject_cast<QQmlExtensionPlugin*>(qt_static_plugin_QtQuickLayoutsPlugin().instance()) ->initializeEngine( &engine, "QtQuick.Layouts");
    qobject_cast<QQmlExtensionPlugin*>(qt_static_plugin_QtQuickLayoutsPlugin().instance()) ->initializeEngine( &engine, "QtQuick.Layouts");
    qobject_cast<QQmlExtensionPlugin*>(qt_static_plugin_QtQuick2WindowPlugin().instance()) ->initializeEngine( &engine, "QtQuick.Window.2");
#endif

    ……
    
    return app.exec( );
}
上海Qt开发联盟,热忱地欢迎你的加入!
离线更好

只看该作者 4楼 发表于: 2014-09-26
编译出错,提示如下:
release/main.o:main.cpp:(.text+0x66): undefined reference to `qt_static_plugin_QtQuickControlsPlugin()'
release/main.o:main.cpp:(.text+0x8e): undefined reference to `qt_static_plugin_QtQuickControlsPlugin()'
release/main.o:main.cpp:(.text+0xb6): undefined reference to `qt_static_plugin_QtQuickControlsPlugin()'
release/main.o:main.cpp:(.text+0xde): undefined reference to `qt_static_plugin_QtQuickLayoutsPlugin()'
release/main.o:main.cpp:(.text+0x15a): undefined reference to `qt_static_plugin_QtQuickControlsPlugin()'
release/main.o:main.cpp:(.text+0x186): undefined reference to `qt_static_plugin_QtQuickLayoutsPlugin()'
release/main.o:main.cpp:(.text+0x1b2): undefined reference to `qt_static_plugin_QtQuickLayoutsPlugin()'
快速回复
限100 字节
 
上一个 下一个