当软件开发完成之后,还有一项很关键的任务要做 - 打包发布 。换句话说,我们的软件最终要交付给用户,并且能够让他们很容易地安装在自己的系统上。那么,该如何制作这样的安装程序(软件包)呢?我们一步一步道来。 1 静态库与动态库 在介绍打包之前,有必要分享一下 静态库与动态库的区别, 因为最终安装包中的文件组成与之息息相关。
Tips: 对于使用 Qt 的应用程序,如果要静态编译,则需要构建一个静态版的 Qt。这意味着,无法关闭源代码并在 LGPL 上回复(要么开放源代码,要么获得商业版 Qt 许可证)。在 Windows 中, 要解决可执行文件过大的问题,可以使用像 UPX 这样的加壳工具。 在对可执行文件压缩之后,会在启动时将其解压缩到 RAM 中。而在 Linux 中, 可以通过 strip 命令来去除目标文件中的调试信息、符号信息,以减小程序的大小。 但要注意一点,strip 只能用于可执行文件和动态库(.so),不能用于静态库(.a)。2 应用程序的组成 对于 Qt 应用程序来说,它们一般由下述文件组成,这些文件可分为三部分:
支持文件可以被集成到可执行文件中,最简单的方法是使用 Qt 资源系统, 它允许将任何文件嵌入到可执行文件中。这是大多数仅由可执行文件(而非用户)使用的文件的逻辑位置,像上面说的图片、翻译文件、帮助文档等,千万不要将示例文档、或者用户希望能够在文件系统中找到的其他文件放在这里面。在创建安装程序时,则需要用到这些资源并从中构建软件包。该包不仅包含了所需的文件,还可能会包含一些说明(例如:ReadMe),以及用户需要遵循的许可协议(License),等等。 3 构建安装程序 从某种程度上来讲, 构建安装程序是平台特定的任务, 而且将来可能会一直都是。这不仅因为平台不同,而且因为分发机制不同。在 Windows 平台上,当构建完 Qt 程序之后, 需要找到其所依赖的动态库(dll)。 为此,可以使用工具 Dependency Walker, 它展示了一个图形树,包含了程序所依赖的 dll,以及每个 dll 依赖的其他 dll。使用 Dependency Walker 有个 诀窍 - 分类查找: 判断哪些 dll 是 Windows 自带的(即:预装在用户计算机上的)、哪些是属于 Qt 的(即:需要打包的)。另外,还要考虑用到的一些第三方库,这可能会增加更多的依赖关系。最后,还有一个需要注意的问题:Qt dll 可以依赖于其他 Qt dll(例如,Qt3Support 模块依赖于大多数其他 Qt 模块)。在使用 Dependency Walker 将所需文件列表放在一起后,下一步是从这些文件中构建一个安装程序,有许多工具都可以完成此任务:
Tips: 在测试安装程序时,建议使用一台没有安装任何 Qt 版本的机器(最好是全新安装的 Windows)。 如果安装程序缺少 dll,将无法运行并显示相应的错误信息,指出缺少哪个 dll。但是,在启动时不会检查插件,因此需要确保测试插件提供的所有功能都存在。对于 Linux 系统来说, 要查看可执行文件依赖的库以及缺少的函数符号,可以使用 ldd -r 指令。 如果要部署 Qt 应用程序,可以选择以下方式:
Tips: 和 Windows 不同的是,Linux 下可执行文件及其依赖库放在同一目录一般是无法正常运行的。常用方式是写一个 Shell 脚本,并用 LD_LIBRARY_PATH 指定依赖库所在目录,然后通过运行这个脚本来间接地启动程序。买不起... 买不起... 买不起... 贫穷限制了我,So 暂不涵盖! 除了上述特定平台的打包方式之外,还有一些支持跨平台的工具:
以上介绍的都是一些比较知名、并且相对稳定的工具,可以很好地帮助我们构建 Qt 安装程序,我相信类似的工具还有很多,不知道你用的是哪一款呢?Enjoy ! ·END· 高效程序员 谈天 · 说地 · 侃代码 · 开车 长按识别二维码,解锁更多精彩内容 ---------------------------------------------------------------------------------------------------------------------- 我们尊重原创,也注重分享,文章来源于微信公众号:高效程序员,建议关注公众号查看原文。如若侵权请联系qter@qter.org。 ---------------------------------------------------------------------------------------------------------------------- |