在OS X上是否可能在不使用Qt Network的情况下部署Qt Quick应用程序?

14

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

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

我在OS X上部署的应用程序中,我的主要二进制文件以及许多Qt Quick插件都依赖于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 Network的情况下使用Qt Quick?
  2. 有没有关于Qt模块依赖的文档?

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


3
QtQml 依赖于 QtNetwork。查看 Qt 源代码,似乎没有办法在不使用 QtNetwork 的情况下构建它。 - Frank Osterfeld
感谢 @FrankOsterfeld。我认为这个回答很好地回答了问题的第一部分。请随意将其添加为答案。 - Simon Warta
4个回答

6

编号。

证明

以下命令行脚本在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

不错的脚本,它只证明了问题的正确描述,但这并没有给出任何解决问题的提示。这不是一个答案。 - Marek R
@MarekR 我添加了“no”,现在应该回答了这个问题。这个脚本可以被解释为自动化的Qt文档。 - Simon Warta
我的答案证明了YES。对于Linux,如果Qt可以作为软件包依赖项提供,那么你的回答应该是NO(但在这种情况下并没有实际问题)。在Qt随应用程序一起提供的平台上,您始终可以自定义Qt功能,因此答案是YES。 - Marek R

2

嗯,QtQml 依赖于 QtDeclarative,而 QtDeclarative 又依赖于 QtNetwork,所以我怀疑你可能无法...

如果您需要了解更多信息,请参考Qt库交叉依赖关系


您发布的链接是Qt 4的一个很好的资源。是否有类似的适用于Qt 5的资源存在? - Simon Warta
@SimonWarta 噢,你是对的,我应该更加注意这个。 - Thomas Ayoub
@SimonWarta,鉴于我给你的页面上最后一次修改是两个月前,我怀疑版本5的文档是否已经发布。但我也怀疑自Qt 4.8以来他们是否改变了很多东西... - Thomas Ayoub
谢谢。让我们看看这是否是我们得到的最好的东西。鉴于Qt 5有许多额外的模块,这并不令人满意。 - Simon Warta

0
我不明白为什么Qt Network的依赖项会被编译到我的二进制文件中。
如果您使用Qt进行静态链接,生成的可执行文件应该只包含所调用的库例程的副本,而不是整个库。

出于许可证原因,我正在进行动态链接。短语“编译为”可能会误导。我认为“链接到”是我想要表达的意思。无论如何,感谢您的提示。 - Simon Warta
啊,是的。我完全忘记了使用GPL版本的Qt进行静态链接是被禁止的。很高兴为您服务。 - uname01

0

你唯一的选择是重新配置和重建Qt
你可以自定义可用功能并摆脱很多东西,而不会违反许可协议。

我已经有一段时间没有这样做了,所以我没有详细信息(我已经丢失了最佳指导链接,如果我找到它,我会告诉你)。我希望上面的文档足够了。我相信你能够在谷歌上找到更好的指导。


感谢您的一般提示。根据提供的信息,我仍然不知道如何在没有Qt Network的情况下部署Qt Quick,也不知道是否可能。 “包括和排除Qt模块”一节将我带回了我的问题。 - Simon Warta
我当前的机器上没有Qt,但是尝试查看configure工具的帮助(使用help开关运行)。你会在那里找到如何禁用一些功能(比如网络连接)的方法。主要问题是在正确的开关下运行configure,之后应该就很简单了。 - Marek R

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接