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

 

不过一定要注意,要将CoderQuestion1.app复制一份,用macdeployqt处理这个拷贝。因为如果你处理原来的Bundle,有可能会造成源代码编译问题。

处理完后,Bundle的目录结构如下图,很明显,macdeployqt命令将相关文件和目录都放到了Bundle中。现在将这个处理完的CoderQuestion1.app复制到任何OS X系统上都可以运行了,无论安装没安装QT,都可以运行。当然,还可以将其打包成dmg文件,这样看起来更酷。

OK,现在我们来看看QTfor Windows应用是如何打包的。Windows下的QT也有类似于macdeployqt的工具,不过叫windeployqt.exe,位于如下的目录中。

C:\Qt\Qt5.4.0\5.4\msvc2013_64_opengl\bin

 

尽管这是个命令行程序,但不要使用Windows的普通控制台进入该目录,要使用QT的控制台,例如,本例使用的是Visual Studio2013版本的,所以应该使用下图黑框中的控制台。

现在进入该控制台,将QT生成的exe文件(本例是CoderQuestion1.exe)复制到其他目录(例如,d:\release),并执行下面的命令。

windeployqtd:\release\CoderQuestion1.exe

执行这行命令后,系统就会将相关的文件和目录放到d:\release目录中。不过这时放到其他Windows系统中,如果未安装Visual Studio2013,仍然是运行不了。这是因为还缺少Visual Studio2013的相关的Library。那么怎么知道缺少哪些Library呢?

一种方法是可以使用相关的工具查看,可以使用DependencyWalker,这是一款可跨平台的工具,可以查看Windows中的exedll等二进制文件的依赖。大家可以上网去下载这款工具。例如,用该工具打开CoderQuestion1.exe,会发现除了QTdll外,还有两个VSdllMSVCP120.DLLMSVCR120.DLL)。读者可以在VS的安装目录搜索这两个文件。不过要注意,选择64位或32位的dll(将这两个文件复制到d:\release目录中),不要选择ARM处理器的同名dll,否则在x86的机器上无法运行。

当然,还有更简单的方法,就是直接复制VS的运行时,大家可以都按如下的目录找到VS2013的运行时。如果是32位系统,需要将x64换成x86

C:\Program Files(x86)\Microsoft Visual Studio 12.0\VC\redist\x64\Microsoft.VC120.CRT

 

里面只有3dll文件,其中两个就是前面通过DependencyWalker工具找到的文件。现在将这3个文件复制到d:\release目录即可。OK,现在将release目录复制到任何Windows机器上(必须是64位系统),就都可以运行了。即使没有安装VS2013QT也一样。

如果大家使用的是32Windows,需要在32位机器上安装32位的QT版本,重新编译,并复制VS201332位的dll即可。d:\release目录的最后结构如下图所示。


更多相关文章

  1. 一款常用的 Squid 日志分析工具
  2. GitHub 标星 8K+!一款开源替代 ls 的工具你值得拥有!
  3. RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
  4. Linux 环境下实战 Rsync 备份工具及配置 rsync+inotify 实时同步
  5. Nginx系列教程(六)| 手把手教你搭建 LNMP 架构并部署天空网络电影
  6. Android(安卓)给应用定制皮肤
  7. Android(安卓)studio ndk 开发轻松两步就搞定,打通Java和c/c++
  8. android studio生成签名文件,以及SHA1和MD5值
  9. Android(安卓)UI设计——TextView控件

随机推荐

  1. 电商直播系统开发Android10.0 导航栏和状
  2. Android储存BMP格式图片
  3. Android(安卓)Listview 隐藏滚动条
  4. Android(安卓)postTranslate和preTransla
  5. Android中创建文件夹和文件的操作
  6. 2011.09.26(5)——— android sample之Note
  7. android 抓包
  8. Android之Input子系统事件分发流程
  9. Android中文API(139) —— SQLiteOpenHelpe
  10. Android(安卓)TextView 动态设置Drawable