【问题标题】:Is it possible to deploy a Qt Quick application without Qt Network on OS X?是否可以在 OS X 上部署没有 Qt 网络的 Qt Quick 应用程序?
【发布时间】:2015-06-10 09:46:58
【问题描述】:

我有一个使用以下模块的 Qt Quick 应用程序

QT = core gui qml quick widgets \
    core-private gui-private \
    multimedia printsupport`

我在 OS X 上部署。现在我的主要二进制文件以及许多 Qt Qtick 插件都显示出对 Qt Network 的依赖。

otool -L /path/to/My.app/Contents/MacOS/My

        /System/Library/Frameworks/Security.framework/Versions/A/Security (compatibility version 1.0.0, current version 55471.14.18)
        /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation (compatibility version 300.0.0, current version 1056.16.0)
        /usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.5)
        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1)
        @executable_path/../Frameworks/QtQuick.framework/Versions/5/QtQuick (compatibility version 5.4.0, current version 5.4.2)
        @executable_path/../Frameworks/QtGui.framework/Versions/5/QtGui (compatibility version 5.4.0, current version 5.4.2)
        @executable_path/../Frameworks/QtCore.framework/Versions/5/QtCore (compatibility version 5.4.0, current version 5.4.2)
        /System/Library/Frameworks/DiskArbitration.framework/Versions/A/DiskArbitration (compatibility version 1.0.0, current version 1.0.0)
        /System/Library/Frameworks/IOKit.framework/Versions/A/IOKit (compatibility version 1.0.0, current version 275.0.0)
        @executable_path/../Frameworks/QtQml.framework/Versions/5/QtQml (compatibility version 5.4.0, current version 5.4.2)
        /Users/me/Qt/5.4/clang_64/lib/QtNetwork.framework/Versions/5/QtNetwork (compatibility version 5.4.0, current version 5.4.2)
        @executable_path/../Frameworks/QtPrintSupport.framework/Versions/5/QtPrintSupport (compatibility version 5.4.0, current version 5.4.2)
        @executable_path/../Frameworks/QtWidgets.framework/Versions/5/QtWidgets (compatibility version 5.4.0, current version 5.4.2)
        @executable_path/../Frameworks/QtMultimedia.framework/Versions/5/QtMultimedia (compatibility version 5.4.0, current version 5.4.2)
        /System/Library/Frameworks/OpenGL.framework/Versions/A/OpenGL (compatibility version 1.0.0, current version 1.0.0)
        /System/Library/Frameworks/AGL.framework/Versions/A/AGL (compatibility version 1.0.0, current version 1.0.0)
        /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.0.0)
        /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 855.17.0)

在以下插件中可以找到对 Qt Network 的相同依赖

My.app/Contents/Frameworks/QtMultimedia.framework/Versions/5/QtMultimedia
My.app/Contents/Frameworks/QtMultimediaQuick_p.framework/Versions/5/QtMultimediaQuick_p
My.app/Contents/Frameworks/QtQml.framework/Versions/5/QtQml
My.app/Contents/Frameworks/QtQuick.framework/Versions/5/QtQuick
My.app/Contents/Plugins/audio/libqtaudio_coreaudio.dylib
My.app/Contents/Resources/qml/QtMultimedia/libdeclarative_multimedia.dylib
My.app/Contents/Resources/qml/QtQuick/Controls/libqtquickcontrolsplugin.dylib
My.app/Contents/Resources/qml/QtQuick/Dialogs/libdialogplugin.dylib
My.app/Contents/Resources/qml/QtQuick/Dialogs/Private/libdialogsprivateplugin.dylib
My.app/Contents/Resources/qml/QtQuick/Layouts/libqquicklayoutsplugin.dylib
My.app/Contents/Resources/qml/QtQuick/PrivateWidgets/libwidgetsplugin.dylib
My.app/Contents/Resources/qml/QtQuick/Window.2/libwindowplugin.dylib
My.app/Contents/Resources/qml/QtQuick.2/libqtquick2plugin.dylib
  1. 是否可以在没有 Qt 网络的情况下使用 Qt Quick?
  2. 是否有 Qt 的模块依赖文档?

我不明白为什么 Qt Network 中的依赖项被编译成我自己的二进制文件。

【问题讨论】:

  • QtQml 依赖于 QtNetwork。查看 Qt 源代码,似乎没有它就无法构建它。
  • 感谢@FrankOsterfeld。我认为很好地回答了问题的第 1 部分。随意添加这个作为答案。

标签: qt qt5 qt-quick qtnetwork


【解决方案1】:

没有。

证明

以下命令行脚本在 Linux 上生成 Qt5 模块的依赖列表:

# Run in e.g. Qt/5.4/gcc_64/lib
for f in libQt5*.so; do mod=$(basename "$f" .so | cut -c "7-"); echo "$mod"; ldd "$f" | grep "libQt5" | cut -f 1 -d">"  | tr -dc "a-zA-Z0-9.[:space:]" | cut -d"." -f 1 | sed 's/libQt5//g'; done

导致以下输出:

Bluetooth
    DBus
    Core
CLucene
    Core
Concurrent
    Core
Core
DBus
    Core
Declarative
    Widgets
    Gui
    Script
    Sql
    XmlPatterns
    Network
    Core
DesignerComponents
    Designer
    Widgets
    Gui
    Xml
    Core
Designer
    Widgets
    Gui
    Xml
    Core
Gui
    Core
Help
    Widgets
    Gui
    Core
    Network
    Sql
    CLucene
Location
    Positioning
    Quick
    Gui
    Core
    Qml
    Network
MultimediaQuick_p
    Quick
    Multimedia
    Gui
    Core
    Qml
    Network
Multimedia
    Network
    Gui
    Core
MultimediaWidgets
    Multimedia
    Widgets
    Gui
    Core
    OpenGL
    Network
Network
    Core
Nfc
    Core
OpenGL
    Widgets
    Gui
    Core
Positioning
    Core
PrintSupport
    Widgets
    Gui
    Core
Qml
    Network
    Core
QuickParticles
    Quick
    Gui
    Qml
    Core
    Network
Quick
    Gui
    Qml
    Network
    Core
QuickTest
    Widgets
    Gui
    Core
    Test
    Quick
    Qml
    Network
QuickWidgets
    Quick
    Widgets
    Gui
    Qml
    Core
    Network
Script
    Core
ScriptTools
    Core
    Widgets
    Gui
    Script
Sensors
    Core
SerialPort
    Core
Sql
    Core
Svg
    Widgets
    Gui
    Core
Test
    Core
WebChannel
    Qml
    Core
    Network
WebKit
    Sensors
    Core
    Positioning
    Quick
    Gui
    Qml
    Network
    WebChannel
    Sql
WebKitWidgets
    Widgets
    WebKit
    Gui
    Network
    Core
    Sensors
    PrintSupport
    OpenGL
    Positioning
    Quick
    Qml
    WebChannel
    Sql
WebSockets
    Network
    Core
Widgets
    Gui
    Core
X11Extras
    Gui
    Core
XmlPatterns
    Network
    Core
Xml
    Core

【讨论】:

  • 不错的脚本,仅证明问题的正确描述,但这并没有给出如何解决问题的任何提示。这不是一个答案。
  • @MarekR 我添加了“否”,现在应该回答这个问题。该脚本可以解释为自动化的 Qt 文档。
  • 我的回答是肯定的。对于 Qt 可以作为包依赖项发布的 Linux,你的正确答案应该是 NO(但在这种情况下没有真正的问题)。在 Qt 附带应用程序的平台上,您始终可以自定义 Qt 功能,所以是的。
【解决方案2】:

好吧,QtQml 依赖于 QtDeclarative,而 QtDeclarative 又依赖于 QtNetwork,所以我怀疑你可以...

对你来说,这里是Qt Library Cross Dependencies

【讨论】:

  • 您发布的链接是 Qt 4 的一个很好的资源。Qt 5 是否存在类似的东西?
  • @SimonWarta 哦,你是对的,我应该更加关注这个
  • @SimonWarta 因为我给你的页面上的最后一次修改是两个月前,我怀疑第 5 版文档已经发布了。但我也怀疑自 Qt 4.8 以来他们改变了很多东西......
  • 谢谢。让我们看看这是否是我们得到的最好的东西。鉴于 Qt 5 有许多附加模块,这并不令人满意。
【解决方案3】:

我不明白为什么 Qt Network 中的依赖项被编译成我自己的二进制文件。

如果您将程序与 Qt 静态链接,则生成的可执行文件应该只包含调用的库例程的副本,而不是整个库。

【讨论】:

  • 出于许可原因,我正在动态链接。 “编译成”这个短语可能具有误导性。我认为“链接反对”是我想说的。无论如何,谢谢你的提示。
  • @Simon Warta 啊,是的。我完全忘记了与 Qt 的 GPL 版本的静态链接是被禁止的。开心。
【解决方案4】:

您的唯一选择是reconfiguring and rebuilding Qt
您可以自定义可用功能并在不破坏许可证的情况下摆脱很多东西。

我很久没有这样做了,所以我没有详细信息(我失去了最佳指导的链接,如果我找到了,我会告诉你)。我希望上面的文档就足够了。我相信您将能够通过 Google 找到更好的指导。

【讨论】:

  • 感谢您的一般提示。从提供的信息来看,我仍然不知道是否以及如何在没有 Qt 网络的情况下部署 Qt Quick。 “包含和排除 Qt 模块”这一段又回到了我的问题。
  • 我目前的机器上没有 Qt,但请尝试查看 configure 工具的帮助(使用帮助开关运行它)。您将在那里找到如何禁用某些功能(如网络)。主要问题是使用适当的开关运行configure,之后它应该是直截了当的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-17
  • 1970-01-01
  • 2017-06-29
  • 1970-01-01
  • 1970-01-01
  • 2018-06-02
  • 1970-01-01
相关资源
最近更新 更多