当前位置:首页 > Windows程序 > 正文

QT5.x应用在Mac OS X和Windows平台的发布过程

2021-03-26 Windows程序

QT是一款非常牛逼的跨平台开发工具,目前可以开发Mac OS XWindowsLinuxAndroidiOS等平台的App。对于AndroidiOS平台,发布相对容易,例如,Android平台是生成apk文件上传到Android设备的,所以直接安装apk文件即可。不过对于PC平台(Mac OS XWindowsLinux)的应用,在发布时就显得麻烦些。

本文主要介绍Mac OS XWindows平台的发布过程。这两个平台运行的应用都称为可执行程序。Windows平台可执行文件扩展名是exeMac OS X平台可执行文件通常没有扩展名,不过标准的Mac OS X执行程序并不只有一个文件,而是一个Bundle。什么是Bundle呢?其实就是一个包含了各种必要文件的目录。在Mac OS X的应用程序中都是这种东西。大家可以选择一个程序,单击鼠标右键,点击“显示包内容”,就可以看到该应用程序Bundle的目录结构。

下面先看看QT5 for Mac OS X的应用如何发布。可能有的同学会认为,直接将QT生成的Bundle复制到其他OS X系统上运行不就行了吗?其实,这么做是不行的,因为QT生成的Bundle之所以可以在QT中运行,是因为本机相关的Library都存在,而且QT知道这些家伙在哪里(当然,肯定不在Bundle中)。而要是将Bundle复制到其他OS X系统中,如果未安装QT,将无法找到这些Library。所以自然无法运行了。

那么该怎么办呢?实际有两种方法:静态编译和动态编译。

静态编译顾名思义,就是将所有的Library都编译进可执行文件。这么做固然很方便。不过当应用非常大时,编译的时间可能比较长,而且生成的可执行文件会很大。当然,还有更大的问题,从官网上下载的QT都是动态编译版本的,要想静态编译,需要自己重新用静态的方式编译整个QT,时间比较长,编译完成后大约2GB左右。当然,如果打算这么做的同学,就不用往后面看了,感觉下载QT源代码,然后编译吧。

现在说一下动态编译的过程。如果从官网上下载的安装版QT,都是动态编译版本的,也就是说,生成的可执行文件不能独立执行。

大家可以用QT随便创建和编译一个工程,然后编译。假设工程名为CoderQuestion1,那么默认的构建目录如下:

/Users/lining/build-CoderQuestion1-Desktop_Qt_5_4_0_clang_64bit-Debug

进到该目录,会看到有一个CoderQuestion1.app。这个并不是文件,而是一个目录,只是OS X系统看到某个目录的扩展名是app,,就会将其认为是Bundle目录,所以双击会直接执行(当然,必须要是真正的Bundle)。现在右键菜单选择“显示包内容”,就会进到该目录中。默认情况下,目录结构如下图所示。

技术分享


MacOS目录中的CoderQuestion1其实就是可执行文件,其他目录中是资源文件。很显然,这样的目录结构太单薄了,复制到其他OS X系统上,很难保证其成功运行。

那么我们应该怎么办呢?废话,当然是复制相关的文件到这个Bundle了。那么我们怎么知道应该复制什么文件呢?其实使用otool工具很容易做到这一点。现在通过Console进入Bundle中的MacOS目录,然后执行下面的命令。

otool -LCoderQuestion1

执行折行命令后,会显示如下图的信息。


技术分享

尽管这里列出了需要的Library,不过一个一个复制太麻烦,而且初学者估计不知道应该复制到Bundle中的哪个子目录。当然,光复制这些内容也是不行的,还需要做一些其他的工作,总之,通过手工处理这些工太麻烦。

幸好QT提供了一个非常方便的打包工具macdeployqt,该文件位于如下目录。

/Users/lining/Qt5.4.0/5.4/clang_64/bin

为了方便,可以将这个目录加入到PATH环境变量中。

现在只需要执行如下的命令,系统就会自动该着Bundle,把相关的文件和目录都放到Bundle中的相关位置。

macdeployqt CoderQuestion1.app

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/67839.html