QT5.x应用在Mac OS X和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)。现在右键菜单选择“显示包内容”,就会进到该目录中。默认情况下,目录结构如下图所示。

wKioL1XkYNvyGSUlAADlnahKOaA867.jpg


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

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

otool -LCoderQuestion1

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


wKioL1XkYaqQyHVzAA8oWxtauu0170.jpg

尽管这里列出了需要的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文件,这样看起来更酷。

wKiom1XkX8izREcZAAR3H_JMzXk219.jpg

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

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

 

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

wKiom1XkYBbQO18WAATPlHD9ycs472.jpg

现在进入该控制台,将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的机器上无法运行。

wKiom1XkYFfA-CREAAUGjZV6180396.jpg

当然,还有更简单的方法,就是直接复制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目录的最后结构如下图所示。


wKioL1XkYrKDbd5DAAQjbdPtRHI195.jpg







 本文转自 androidguy 51CTO博客,原文链接:http://blog.51cto.com/androidguy/1690306,如需转载请自行联系原作者


相关文章
|
4天前
|
Python Windows
在 Windows 平台下打包 Python 多进程代码为 exe 文件的问题及解决方案
在使用 Python 进行多进程编程时,在 Windows 平台下可能会出现将代码打包为 exe 文件后无法正常运行的问题。这个问题主要是由于在 Windows 下创建新的进程需要复制父进程的内存空间,而 Python 多进程机制需要先完成父进程的初始化阶段后才能启动子进程,所以在这个过程中可能会出现错误。此外,由于没有显式导入 Python 解释器,也会导致 Python 解释器无法正常工作。为了解决这个问题,我们可以使用函数。
13 5
|
10天前
|
存储 安全 调度
深入理解操作系统:从基础概念到高级应用
本文将深入探讨操作系统的基本概念、功能和特性,以及其在现代计算环境中的应用。我们将从操作系统的定义和历史开始,然后详细介绍其主要组件和工作原理,包括进程管理、内存管理、文件系统和设备管理等。最后,我们将讨论一些高级主题,如操作系统的安全性、性能优化和虚拟化技术。无论您是计算机科学的学生,还是对操作系统有兴趣的技术人员,这篇文章都将为您提供深入理解和应用操作系统所需的知识和技能。
|
26天前
|
JSON 数据管理 测试技术
自动化测试工具Selenium Grid的深度应用分析深入理解操作系统的内存管理
【5月更文挑战第28天】随着互联网技术的飞速发展,软件测试工作日益复杂化,传统的手工测试已无法满足快速迭代的需求。自动化测试工具Selenium Grid因其分布式执行特性而受到广泛关注。本文旨在深入剖析Selenium Grid的工作原理、配置方法及其在复杂测试场景中的应用优势,为测试工程师提供高效测试解决方案的参考。
|
26天前
|
机器学习/深度学习 传感器 自动驾驶
基于深度学习的图像识别技术在自动驾驶系统中的应用深入理解操作系统内存管理:原理与实践
【5月更文挑战第28天】 随着人工智能技术的飞速发展,图像识别作为其重要分支之一,在多个领域展现出了广泛的应用潜力。尤其是在自动驾驶系统中,基于深度学习的图像识别技术已成为实现车辆环境感知和决策的关键。本文将深入探讨深度学习算法在自动驾驶图像识别中的作用,分析其面临的挑战以及未来的发展趋势,并以此为基础,展望该技术对自动驾驶安全性和效率的影响。
|
9天前
|
Rust Linux iOS开发
Rust 交叉编译 macOS 为 Linux 和 Windows
Rust 交叉编译 macOS 为 Linux 和 Windows
22 0
|
1月前
|
Windows 安全 C++
Qt字符串类应用与常用基本数据类型
Qt字符串类应用与常用基本数据类型
|
25天前
|
安全 iOS开发 MacOS
Mac pro升级 MacOS 10.15 Catalina 后根目录是只读的, Recovery OS不能访问
Mac pro升级 MacOS 10.15 Catalina 后根目录是只读的, Recovery OS不能访问
22 0
|
27天前
|
机器学习/深度学习 监控 调度
深度学习在图像识别中的应用与挑战深入理解操作系统中的进程调度策略
【5月更文挑战第27天】 随着人工智能技术的飞速发展,深度学习已经成为图像识别领域的核心技术。本文将探讨深度学习在图像识别中的应用,以及在实际应用中所面临的挑战。我们将介绍深度学习的基本原理,以及如何将其应用于图像识别任务中。此外,我们还将讨论在实际应用中可能遇到的一些问题,如数据不平衡、模型过拟合等,并提出相应的解决方案。
|
27天前
|
存储 缓存 算法
深入理解操作系统内存管理:分页系统的优势与挑战构建高效Android应用:探究Kotlin协程的优势与实践
【5月更文挑战第27天】 在现代计算机系统中,内存管理是操作系统的核心功能之一。分页系统作为一种内存管理技术,通过将物理内存划分为固定大小的单元——页面,为每个运行的程序提供独立的虚拟地址空间。这种机制不仅提高了内存的使用效率,还为多任务环境提供了必要的隔离性。然而,分页系统的实现也带来了一系列的挑战,包括页面置换算法的选择、内存抖动问题以及TLB(Translation Lookaside Buffer)的管理等。本文旨在探讨分页系统的原理、优势及其面临的挑战,并通过分析现有解决方案,提出可能的改进措施。
|
1月前
|
关系型数据库 MySQL iOS开发
macOS Catalina(10.15)如何访问iPhone(Ipad)的应用文档文件
macOS Catalina(10.15)如何访问iPhone(Ipad)的应用文档文件
22 0

推荐镜像

更多