Mac中QT程序发布
基于Qt开发的应用程序进驻Mac App Store
最近摸索着将一个基于用Qt开发
的App发布到Mac App Store
,在网上查找相关资料的时候,发现很多文档都过期了,要有一些修改,所以想记录下来,希望能帮助有需要的同学,让他们少走一些弯路。
这里我们假设你已经有一个Mac开发者账号
,成功安装好了相关证书,并且已经准备好你的App了(release版,但未部署)。
第一步:打包
在Mac下,对基于Qt应用程序的部署,官方文档这里已经讲解很详细了
我用的是
framework的方式
,大致意思就是要把所依赖的库和插件拷贝到App的Bundle里,然后修改程序的依赖链接,让其启动时加载的是Bundle里的库和插件。
Qt自带的macdepolyqt
工具能够很方便的帮助你实现这一目的。
虽然很多人觉得这个工具并不完美,会把一些实际上用不到的插件和库也会拷贝进去
这是因为它本身的判断方式,比如你的程序用到了QtSql.framework, 那么它就会把所有的sqldrivers目录中的插件都拷贝过来,而不管你的程序有没有用到,这让你的程序变得臃肿)
但是对于初学者,我相信你更喜欢用这种方式,因为它相当简单
。
假如你是一个完美主义者,对自己的App有着严格的要求,那么建议你自己写Shell Script
去把程序用到的Framework和Plugins都拷贝进去,然后修改依赖链接。
Xcode自带指令帮你查看程序依赖哪些库,库又依赖了哪些库,插件依赖了哪些库,如果想要知道程序是如何加载插件的,可以查阅这里,当然也有指令修改这些依赖。这些都可以在上面提供的链接里找到。
第二部:sandbox 和 info.plsit文件
Windows程序员可能不知道什么是sandbox
。赶紧恶补一下,可以去google一下或者看下Apple的官方文档
你要有一个.entitlements
的文件(为第三步做准备),里面就是你需要的sandbox权限(其实就是个xml格式的文件,记录着一些键值对,你可以用Xcode新建一个项目,然后勾选需要的sandbox权限,生成的.entitlements
文件就可以拿过来用了)。
如果没有勾选相关的权限,在签名之后是无法正常使用相关功能的。
这里说的info.plist
文件是整个程序的,在App所在目录/Contents
下和后面说的info.plist文件不是同一个(但作用都是一样的)。
Qt默认生成的info.plist 文件是不符合上Mac App Store要求的,需要额外加一些键值对,比如能运行的最低系统版本信息等等。详情可以参看Apple的文档。
第三部:签证书
在完成上一步后,所有用到的库和插件都已经拷贝到程序所在的Bundle里面了
。
可以按照这里的说明进行Code Signing
,但是这里需要注意的是,
在签证书之前必须手动的把每个Framework下面的info.plist文件考到相应的目录下
以QtCore.framework
为例,你需要将Qt安装目录/5.2.0/clang_64/lib/QtCore.framework/Contents/info.plist
拷贝到App所在目录/Contents/Frameworks/QtCore.framework/Resources/
, 否则在给Framework签证书的时候会失败,当然会导致最后给整个Bundle签证书的时候失败。签证书的顺序应该是先签里面的Framework 和Plugins,最后签整个Bundle。
签成功之后,除了Plugins,每个Framework的子目录内和Contents目录下都会有一个_CodeSignature
的文件夹。
http://www.sollyu.com/mac-qt-program-released/
Mac中QT程序发布的更多相关文章
- Linux环境中Qt程序的手工发布
Linux环境中Qt程序的手工发布
- qt 程序发布
Qt 程序发布步骤: 注意5.5 以后不再支持 WinXP 1) dll 抽取工具 windeployqt.exe 2) Windows脚本 实例: D:\Qt\Qt5.5.0\5.5\mingw49 ...
- Qt 程序发布以及打包成exe安装包
一.简述 Qt 项目开发完成之后,需要打包发布程序,而因为用户电脑上没有 Qt 配置环境,所以需要将 release 生成的 exe 文件和所依赖的 dll 文件复制到一个文件夹中,然后再用 Inno ...
- 基于vs2005以上版本Qt程序发布的注意事项(讲了manifest的问题)
最近发现了一个非常恼人的程序deployment的问题,估计大家有可能也会遇到,特此memo. 问题的出现我觉得主要还是微软搞的花头太多, 一个不知所谓的manifest文件让本来简单的程序发布变得困 ...
- 解决Qt程序发布时中文乱码问题(通过QApplication.addLibraryPath加载QTextCodec插件)
Qt程序的文字编码,是通过插件来解决的,所以我们发布的时候需要把相应的插件也发布出去,在开发者电脑上程序会自动从插件目录加载到插件,但是如果发布给别的电脑使用,需要手动指定插件路径,如下所示: int ...
- QT程序发布
1.新建一个脚本文件,后缀为.bat 2.查看自己qt的windeployqt.exe路径,一般在QT安装的bin目录,而且脚本程序中需要去掉其后缀, 前面部分是windeployqt.exe的路径以 ...
- VS编译的QT程序发布时产生的AppCrash问题
至少我碰到了三个情况,都是AppCrash错误(以下都指VS2008的Release的设置) 第1个错误,报错模块是程序自己 我使用VS2008 Team with SP1和QT4.86编译程序,一直 ...
- qt 程序发布打包
1. 首先把 release 版本的 exe 复制到其他文件夹,比如 Desktop\test 2. 使用开始菜单中 qt 里面的控制台窗口,使用 cd 命令打开到 Desktop\test 位置,然 ...
- Windows 下QT程序发布
方法1:利用QT自带打包工具 1.新建文件夹,把编译好的exe文件放入该文件夹 2.使用QT下的命令行 3.进入该exe所在文件,执行windeployqt xxx.exe,若出现找不到命令的情况 4 ...
随机推荐
- c++ 输出虚函数表内容
class Base{ public: virtual void f(){cout<<"Base::f"<<endl;} virtual void g(){ ...
- 前端笔试面试中的常用知识点总结(CSS)
1.CSS选择器的优先级!important > 内联 > id选择器 > 类选择器 > 标签选择器多个类选择器叠加(256)之后的优先级大于一个id选择器!importan ...
- backbone HTTP方法中 options参数
wait: 可以指定是否等待服务端的返回结果再更新model.默认情况下不等待url: 可以覆盖掉backbone默认使用的url格式attrs: 可以指定保存到服务端的字段有哪些,配合options ...
- (待解决问题)nowrap在table和td都设置了宽度的时候仍然有效
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...
- HTML解决div里面img的缝隙问题
图片IMG与容器下边界之间有空隙怎么办?这里介绍3中简单的解决方法. 第一,给图片img标签display:block. img{display:block} 第二,定义容器里的字体大小为0. div ...
- Cobbler自动化部署
一:PXE.Kickstart与Cobbler的概念: PXE(preboot execute environment,预启动执行环境)是由Intel公司开发的技术,需要网卡的硬件支持,工作于C/S的 ...
- linux小命令
本文主要记录了我在工作中用到的一些linux命令 1.查询linux系统是32位还是64位 zhaolei@zhaolei :~# file /usr/bin/whoami/usr/bin/whoam ...
- 函数重载不仅仅是看其参数,还要看是否有const修饰
比如QString有两个函数,可以堂而皇之的存在,原因就在于有了const修饰以后,编译器不把两个函数当作同一个函数名了: QChar * data() const QChar * data() co ...
- python中的有趣用法
本文给除了python中几个有趣的用法,可以给我们不一样的启发 1: Python中模拟使用C++ 中的 cout << import sys class ostream: def ...
- BZOJ 1726: [Usaco2006 Nov]Roadblocks第二短路
1726: [Usaco2006 Nov]Roadblocks第二短路 Description 贝茜把家搬到了一个小农场,但她常常回到FJ的农场去拜访她的朋友.贝茜很喜欢路边的风景,不想那么快地结束她 ...