【问题标题】:How to distribute an application with libraries?如何使用库分发应用程序?
【发布时间】:2016-01-11 11:53:28
【问题描述】:

我编写了一个 Qt C++ 应用程序并希望将它部署在 Windows、OSX 和 Linux 上。问题是,它只适用于安装了 Qt 的机器。

如何让它在没有 Qt 的计算机上运行?我是否必须使用应用程序设置或其他方式安装它?我不明白整个链接的事情。

【问题讨论】:

  • 是静态链接还是在您的发行版中包含库二进制文件?
  • @KerrekSB 据我所知,只有商业许可才允许静态链接 Qt 库。无论如何,像 Qt Creator 这样的 IDE 不应该自动包含 Qt 库吗?我将如何手动链接它们?
  • 使用搜索! Deploying Qt Applications
  • @Drop 感谢您提供此链接。很抱歉发布了重复的问题。

标签: c++ qt libraries software-distribution


【解决方案1】:

有很好的工具来准备分发应用程序。它的macdeployqt 用于 OSX,windeployqt 用于 Windows。他们将所有依赖项复制到应用程序文件夹中,因此您可以将该文件夹复制到另一台机器上。对于 linux,您需要创建包。这针对不同的linux版本。阅读有关部署的更多信息here

【讨论】:

  • 感谢您的回答。我不知道有必要这样做。因此,对于 Windows 和 OSX,我使用部署工具将所有依赖项复制到目录中,然后创建设置。在 Linux 上,我会使用该工具查找所有可用的依赖项,在编译时链接到它们,然后在包中声明它们的依赖项。对吗?
【解决方案2】:

在 Windows 上,我们鼓励您将 Qt DLL 文件与您的应用程序一起分发。只需将它们与安装文件中的可执行文件放在同一文件夹中即可。

【讨论】:

    【解决方案3】:

    在 Linux 下你可以使用包系统(参见 RPM,或 deb 包)

    对于 Windows,您只需将 .ddl 文件包含在可执行文件中(为什么不将其压缩到安装程序中(请参阅 Easysetup 工具)

    【讨论】:

      【解决方案4】:

      我不能代表Windows,但Linux 系统有一个包管理系统,它检查所需的依赖关系,因此安装时包管理系统会处理所有这些问题。您只需要为您希望支持的每个发行版生成安装包,尽管由于相似性,许多发行版会接受相同的包。

      Building an RPM

      还有:Debian Packaging

      这是Linux 发行版使用的两个流行的包系统..

      【讨论】:

        【解决方案5】:

        对于 Windows,Pierre 和 ypnos 的答案很好。我会添加将“鼓励”更改为 must,因为这是逃离 dll 地狱的唯一方法。使用安装程序的缺点是安装您的应用程序的用户需要管理员权限。只需压缩整个应用程序目录并向用户提供该 zip 文件就足以让它在任何 Windows 客户端计算机上运行。

        对于 Linux,请参阅我的回答 on another Stackoverflow question. 我提供的解决方案基本上适用于任何 Linux 发行版。您将所有依赖项复制到应用程序目录并通过启动首先设置 LD_LIBRARY_PATH 的 shell 脚本来运行您的应用程序。如果您有该脚本还创建一个 Linux 桌面文件,您的用户可以从那时起双击该桌面文件。运行您的应用程序将对您的用户透明。许多主要的 Linux GUI 应用程序(如 Google 的 chrome)都是从桌面文件启动的。脚本的迂回是必要的,因为桌面文件中包含硬编码的应用程序目录,并且您无法预测用户想要部署应用程序的位置。使用包管理器并不是那么简单。此外,还有大约 20 个不同的 Linux 包管理器。

        对于 OSX,您可以尝试使用 Qt 实用程序 macdeployqt。我们一直在使用该实用程序时遇到问题。我们使用 qmake 脚本自己完成。你告诉 Qt Creator 创建一个 app_bundle。我已经描述了somewhere else 如何对 OSX Qt 应用程序进行数字签名。部分签名要求应用程序是独立的。您可以阅读我回答的那部分内容。如果您将部署脚本与主 pro 文件分开,您可以为所有 OSX 应用程序重用该脚本。

        【讨论】:

          猜你喜欢
          • 2011-05-17
          • 1970-01-01
          • 1970-01-01
          • 2018-08-05
          • 2017-10-07
          • 2020-10-08
          • 2019-11-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多