如何在Linux和Windows上发布Qt/C++应用程序?

4
我使用Qt进行图形界面开发的C++应用程序,现在希望将其发布到Linux和Windows平台上。我已经查阅了文档、论坛和教程,但仍不太清楚需要做什么。
在不同的术语之间我感到相当困惑:发布和部署有什么区别?何时需要安装程序,如果需要,如何创建一个?
为创建Windows的.exe文件以及不同版本的Linux(Debian,Ubuntu,Ubuntu Mate)的等效文件,都需要采取哪些步骤?
我目前在Ubuntu上,并且使用Qt Creator编写应用程序。
据我所知,我需要部署共享库。
任何对于初学者来说有帮助、回答、指南或文档的帮助都将非常受欢迎 :)

你正在开发什么类型的应用程序?在什么背景下(研究原型,商业产品)?面向什么受众(同行学者还是普通消费者)?专有二进制或开源?代码大小是多少?请编辑您的问题以改进它并提供更多细节(包括对您重要的分布)。 - Basile Starynkevitch
2个回答

7

有几种方法可以部署应用程序

1. 使用windeployqt / linuxdeployqt部署您的应用程序

这是最简单的方法,windeployqt或linuxdeployqt是一个应用程序,它将复制所有必需的依赖项到您的可执行文件夹中。准备在另一台计算机上运行。

步骤很简单:

  1. 以发布模式编译二进制文件
  2. 打开Qt开发人员控制台,键入windeployqt "C:\ folder \ of \ your \ executable"(linuxdeployqt非常相似)
  3. 复制到应用程序文件夹中的所有库都需要在另一台计算机上运行该应用程序。您可以创建一个存档并将其发送给其他人。

注意:linuxdeployqt 是第三方工具。

2. 静态构建

静态构建将在最终生成一个包含所有Qt代码的单个二进制文件。您可以将单个二进制文件发送给某人,不需要额外的库来运行它。由于所有Qt代码都链接在可执行文件中,因此可执行文件较大。

步骤如下:

  1. 下载Qt源代码
  2. 将其解压缩到文件夹中
  3. 打开已安装编译器的开发人员控制台(即MingW或MSVC)
  4. 切换到该文件夹并键入

    ./configure -static -static-runtime

  5. 配置完成后,键入nmakemake以静态构建Qt。
  6. 当构建过程完成后,在Qt Creator中创建一个新的kit,并选择源代码文件夹中的新的qmake.exeqmake
  7. 在项目设置中选择您的kit以构建一个静态可执行文件,该文件不需要任何其他库。

3. 离线/在线安装程序

这一步需要一些阅读和微调。 Qt带有一个IFW(Installer Framework),您可以在其中创建在线和离线安装程序。安装程序将包含您的可执行文件和所有依赖项的.7z文件。安装程序对用户更加舒适。它可以创建快捷方式,检查可用磁盘空间等。

如果使用MSVC静态构建安装程序,则需要运行时库,否则您必须将运行时库一起发送。如果使用MingW构建,则可能不需要任何运行时库。

选择哪种方法由您决定。如果您拥有商业许可证,可以将所有闭源代码作为静态构建发布,但通常最好以动态构建的形式发布,特别是在使用OpenSSL时,用户可以快速自行更换易受攻击的库。


谢谢你的回答 :) 目前我是通过Linux进行部署,但当我通过Windows进行部署时,我会记住你的回答 :) - Juliette Marquis
Juliette Marquis:Linux将完全相同。您可以使用linuxdeployqt。静态构建、安装程序基本相同。因此答案对于两者都是一样的。 - user3606329
Juliette Marquis:我刚刚在我的帖子中添加了linuxdeployqt。在Linux上,您选择qmake而不是qmake.exe。其他都一样。例如,通过静态编译可以在Linux上发布单个二进制文件。 - user3606329
朱丽叶·马奎斯:在Linux上,您还可以创建一个软件包,即.deb文件,安装所有内容,但是答案已经在其他帖子中涵盖了。现在您有4种部署应用程序的方式。 - user3606329
朱莉叶·马奎斯:不,你需要在目标操作系统(Windows)上进行编译。如果你想从 Linux 等平台构建适用于所有操作系统的程序,你需要学习跨平台编译。这是一个更加复杂的任务,有时很难设置完成。 - user3606329
显示剩余2条评论

0
据我所知,我需要部署共享库。也许不用。首先要注意的是,你不是发布到Linux(通常情况下),而是发布到特定的Linux发行版。细节很重要,在Ubuntu 15、Ubuntu 16、Debian 9、Fedora等系统上都有所不同。 (我猜在Windows上可能也是一样的:Windows的版本可能很重要,所以Windows 7和Windows 10不一样) 你应该优先使用目标Linux发行版上安装的Qt(其次要版本会因发行版而异)。你可能想要为目标Linux发行版的软件包制作软件包管理器。在Debian或Ubuntu上,这将是一些.deb软件包(你不能确定你的Ubuntu .deb软件包能否在Debian上正常运行,但通常情况下可以) 一个软件包管理器可以处理依赖关系。所以,如果用户安装了您提供的正确的.deb,软件包管理器将失败,或者(更常见的是)下载并安装所有需要的依赖项(例如Qt)。
(或者,您可以分发源代码-可能作为免费软件-并将编译的任务留给您的用户或分销商)
如何创建Linux软件包已经被特定发布版文档化,并且是一个不同的问题。对于Debian,请参见这里

谢谢你的回复 :) “你应该优先使用目标Linux发行版上已安装的Qt(其次版本可能因不同的发行版而异)。”:这将要求任何用户在其计算机上安装Qt,对于不知道如何编程的人来说可能会有一些困难…… 另一个问题是我需要为至少4种不同的Linux发行版发布版本... - Juliette Marquis
不需要。如果您正确制作了 juliette.deb,安装该包的命令将自动处理依赖项,并在缺少 Qt 二进制包时下载它们。 - Basile Starynkevitch
那么,我唯一需要的就是一个 .deb 文件吗?它会处理好一切吗? - Juliette Marquis
顺便说一句,你需要改进你的问题,而不是在这里在评论中提供细节。 - Basile Starynkevitch
1
是的,“它会处理一切”,花几个小时阅读有关软件包管理的内容。 - Basile Starynkevitch
1
另一件事是我需要为至少4个不同的Linux发行版发布版本...你可以创建“deb”和“rpm”包,并在其中列出其依赖项。这将覆盖大多数发行版并自动安装所有依赖项。 - Andrejs Cainikovs

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