Qt安装下载:Qt官网下载
下载Qt5.8 for mac
制作macOS系统安装U盘的命令:
sudo /Applications/Install\ macOS\ Sierra.app/Contents/Resources/createinstallmedia --volume /Volumes/macOS --applicationpath /Applications/Install\ macOS\ Sierra.app --nointeraction
Mac下安装 Qt需先安装Xcode Qt官网
一步步按指引完成安装即可
用brew的好处是稍微省心一些,不用折腾更新什么的,万一要重装什么的也可以brew bundle dump然后在新机器上brew bundle一把了事。brew安装的时候已经安装好了Xcode Command Line Tools等,必要的话把它更新一下(App Store会自动提醒)。
brew install qt
brew cask install qt-creator
首先brew info qt一下,可以看到:
─ brew info qt
qt: stable 5.10.0 (bottled), HEAD [keg-only]
Cross-platform application and UI framework
https://www.qt.io/
/usr/local/Cellar/qt/5.10.0 (9,351 files, 290MB)
Poured from bottle on 2017-12-30 at 20:16:37
From: https://github.com/Homebrew/homebrew-core/blob/master/Formula/qt.rb
==> Dependencies
Build: pkg-config ✘
Optional: mysql ✘, postgresql ✘
==> Requirements
Build: xcode ✔
Required: macOS >= 10.8 ✔
==> Options
--with-docs
Build documentation
--with-examples
Build examples
--with-mysql
Build with mysql support
--with-postgresql
Build with postgresql support
--HEAD
Install HEAD version
==> Caveats
We agreed to the Qt opensource license for you.
If this is unacceptable you should uninstall.
This formula is keg-only, which means it was not symlinked into /usr/local,
because Qt 5 has CMake issues when linked.
If you need to have this software first in your PATH run:
echo 'export PATH="/usr/local/opt/qt/bin:$PATH"' >> ~/.zshrc
For compilers to find this software you may need to set:
LDFLAGS: -L/usr/local/opt/qt/lib
CPPFLAGS: -I/usr/local/opt/qt/include
显然,为了不跟系统过多耦合导致问题,qt包根本没把自己注册到系统里,也就是装完qt也不能直接在命令行qmake,而是需要/usr/local/opt/qt/bin/qmake。知道了qmake工具链的路径,就可以开始配置:
大部分其他项目留默认就好,但是:
非常重要:既然这里的qt是Clang编译出来的,那么“编译器”一栏默认的GCC当然就不合适了,必须改为Clang,参见上图。不修改的话,构建项目时会报错Project ERROR: failed to parse default search paths from compiler output.
Homebrew官网
打开终端输入命令:
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
在 successful 后面还有个步骤,Terminal 中运行 brew doctor,doctor 让你的系统 ready to brew。
命令行输入:
brew install python3
brew install sip
brew install pyqt
如果成功安装 Qt5 ,那么会默认安装 PyQt5。一般来说 brew 安装完毕,系统就会自动找到 PyQt5,但如果安装路径或者环境变量有问题,系统找不到 PyQt5,那么我们在后续会介绍另一种手动的方法。
安装 SIP
sip-4.17
$ python3 configure.py
This is SIP 4.17 for Python 3.5.1 on darwin.
The SIP code generator will be installed in
/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/bin.
The sip module will be installed in
/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages.
The sip.h header file will be installed in
/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/include/python3.5m.
The default directory to install .sip files in is
/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/share/sip.
Creating siplib/sip.h...
Creating siplib/siplib.c...
Creating siplib/siplib.sbf...
Creating sipconfig.py...
Creating top level Makefile...
Creating sip code generator Makefile...
Creating sip module Makefile...
$ make
cc -c -pipe -Os -w -DNDEBUG -I. -o main.o main.c
cc -c -pipe -Os -w -DNDEBUG -I. -o transform.o transform.c
cc -c -pipe -Os -w -DNDEBUG -I. -o gencode.o gencode.c
cc -c -pipe -Os -w -DNDEBUG -I. -o extracts.o extracts.c
cc -c -pipe -Os -w -DNDEBUG -I. -o export.o export.c
cc -c -pipe -Os -w -DNDEBUG -I. -o heap.o heap.c
cc -c -pipe -Os -w -DNDEBUG -I. -o parser.o parser.c
cc -c -pipe -Os -w -DNDEBUG -I. -o lexer.o lexer.c
c++ -headerpad_max_install_names -o sip main.o transform.o gencode.o extracts.o export.o heap.o parser.o lexer.o
cc -c -pipe -fPIC -Os -w -DNDEBUG -I. -I/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/include/python3.5m -o siplib.o siplib.c
cc -c -pipe -fPIC -Os -w -DNDEBUG -I. -I/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/include/python3.5m -o apiversions.o apiversions.c
cc -c -pipe -fPIC -Os -w -DNDEBUG -I. -I/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/include/python3.5m -o descriptors.o descriptors.c
cc -c -pipe -fPIC -Os -w -DNDEBUG -I. -I/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/include/python3.5m -o qtlib.o qtlib.c
cc -c -pipe -fPIC -Os -w -DNDEBUG -I. -I/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/include/python3.5m -o threads.o threads.c
cc -c -pipe -fPIC -Os -w -DNDEBUG -I. -I/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/include/python3.5m -o objmap.o objmap.c
cc -c -pipe -fPIC -Os -w -DNDEBUG -I. -I/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/include/python3.5m -o voidptr.o voidptr.c
cc -c -pipe -fPIC -Os -w -DNDEBUG -I. -I/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/include/python3.5m -o array.o array.c
c++ -c -pipe -fPIC -Os -w -DNDEBUG -I. -I/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/include/python3.5m -o bool.o bool.cpp
c++ -headerpad_max_install_names -bundle -undefined dynamic_lookup -o sip.so siplib.o apiversions.o descriptors.o qtlib.o threads.o objmap.o voidptr.o array.o bool.o
$ sudo make install
cp -f sip /usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/bin/sip
cp -f sip.so /usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/sip.so
cp -f /Users/Gavin/Downloads/PyQt/sip-4.17/siplib/sip.h /usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/include/python3.5m/sip.h
cp -f sipconfig.py /usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/sipconfig.py
cp -f /Users/Gavin/Downloads/PyQt/sip-4.17/sipdistutils.py /usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/sipdistutils.py
最终安装在/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/bin/sip,记住这个地址,安装PyQt5会用到。
安装 PyQt5
PyQt-gpl-5.5.1
$ python3 configure.py -q /Users/Gavin/Develop/Qt-5.5.1/5.5/clang_64/bin/qmake -d /usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages --sip /usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/bin/sip
# -q 为 Qt 的 qmake 路径
# -d 为 python3.5 的 site-packages,可通过 import site; site.getsitepackages() 来查看
# --sip 为 sip 的路径
$ make
# 时间比较长
$ sudo make install
可能出现的错误:fatal error: ‘qgeolocation.h’ file not found,
下载‘qgeolocation.h’放入PyQt-gpl-5.5.1/QtPositioning/即可
测试安装
新建一个hello.py文件
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
w = QtWidgets.QWidget()
w.resize(250, 150)
w.move(300, 300)
w.setWindowTitle('Hello PyQt')
w.show()
sys.exit(app.exec_())
终端运行:
python3 hello.py
如果有这个窗口弹出
则说明已经成功搭建好开发环境,Ubuntu的搭建和Mac类似,Windows下载PyQt5的Binary Packages一键就可以搭建好。
brew list #列出 brew 安装的内容;
which XXX # 继而输入 ,列出 XXX 所在的安装路径
配置
如果安装完毕,但是试运行的时候程序找不到 PyQt5,那么我们将采取如下办法手动安装:
选择“+”之后,进入如下页面,输入“PyQt5”并安装该 package。
程序会开始安装,安装成功后,程序就可以识别到 PyQt5。
测试安装:
检验是否能识别到 PyQt5
写一个小函数,函数头(函数刚开始的地方)写上 from PyQt5 import QtCore, QtGui, QtWidgets 如果程序可以正常识别(不画红色下划线),那么一般就是识别成功了
测试: 输入qmake -v 可以显示版本号,则配置成功。
Mac下Qt导出安装包的时候需要使用 macdeployqt ismartviewpro.app 将需要的库拷贝到沙盒中。
2. 偏好设置-Kits-构建套件(Kit)-手动设置-桌面(默认)-Qt版本-Qt 5.11.2
Project ERROR: failed to parse default search paths from compiler output
Error while parsing file /Users/hanpeizhi/Qt5/testProject01/testProject01.pro. Giving up.
Project WARNING: Qt has only been tested with version 10.13 of the platform SDK, you're using 10.13.4.
Project WARNING: This is an unsupported configuration. You may experience build issues, and by using
Project WARNING: the 10.13.4 SDK you are opting in to new features that Qt has not been prepared for.
Project WARNING: Please downgrade the SDK you use to build your app to version 10.13, or configure
Project WARNING: with CONFIG+=sdk_no_version_check when running qmake to silence this warning.
解决办法:
打开终端输入命令:
xcode-select -p
sudo xcode-select -s /Applications/Xcode.app/Contents/Developer
QT开发的程序发布的时候经常采用两种方式:
l 静态编译,可生成单一的可执行文件。
l 动态编译,需同时附上需要的dll文件。
不管采用哪种方式,首先我们要把项目的发布做一些准备,例如:准备程序的图标,将项目编译成release等。
应用程序的图标分两种:
首先在绘图工具(例如Photoshop)中设计好图标,图标的分辨率最好大于3232。图标需要用ico或*png的文件。如果想偷懒一点,直接去这里(http://www.iconfinder.com/)下载,大量好看免费的图标。
将刚才的生成的图标文件放到yourProjectFolder/Resources/images目录下,或者任意一个程序可以找到的位置。最好将图标文件添加到qrc中统一管理,qrc文件的格式如下:
christmas_stocking.png
然后再主窗口中使用,代码如下,代码很简单,不过记住这句代码一定要放到Mainwindow的构造函数里去,不然不会work。
/setwindowicon/
setWindowIcon(QIcon(QStringLiteral(":/background/mainlogo")));
程序运行后的效果如下:
设置运行程序的图标在各个平台是各不相同的,下面分别介绍。首先准备分辨率最好大于3232的图标文件。图标需要用ico的文件。
如果使用的是VisualStudio IDE开发工具,例如在VS2015中,项目上右击,添加,资源,选择icon,然后将之前准备的*ico图标文件导入,确定之后项目中就会出现一个 projectname.rc 的文件。
如果你是使用qmake生成makefile文件或使用QT Creator IDE,那么按下面三步实施:
l 第一步:创建一个包含图标图像的ICO文件,并将其保存在资源文件目录下,例如命名为:myapp.ico;
l 第二步:创建一个.rc文件,包含如下内容:
IDI_ICON1 ICON DISCARDABLE “myapp.ico”
l 第三步:在工程文件myapp.pro文件中写入如下内容:
RC_FILE = myapp.rc
再次编译程序,即可达到效果,效果图如下:
虽然许多程序可以创建图标文件(.icns),推荐的方法是使用由苹果公司提供的程序iconutil。Iconutil是一个命令行工具,它允许您导入多个不同大小的图标(在不同的上下文中使用),并能压缩文件。在您的项目目录中将所有一系列的图标保存在一个文件中。
如果您正使用qmake生成makefile文件,您只需要将一个单一的行添加到您的.pro工程文件。例如,如果您的图标文件的名称是myapp.icns,并且您的项目文件名称是myapp.pro,加入这一行到myapp.pro:
ICON = myapp.icns
这将确保qmake把你的图标放在适当的位置并为图标创建一个Info.plist条目。
如果你不使用qmake,你必须手动执行以下几点:
为您的应用程序(使用PropertyListEditor,在Developer/Applications中可以找到)创建一个Info.plist文件。
在Info.plist文件(同样,使用PropertyListEditor)关联您的.icns记录和CFBundleIconFile记录。
将Info.plist文件复制到你的应用程序包的Contents目录。
复制.icns文件到你的应用程序包的Contents/Resoures目录。
在本节中,我们简要地介绍一下在两种常见的linux桌面环境:KDE和GNOME,为应用程序提供图标的相关问题 。为这两种桌面,用来描述应用程序图标的核心技术是相同的,也可以适用于其他,但具体到每一个来讲也有各自的细节。对使用这些Linux桌面系统的标准信息的主要来源是freedesktop.org。有关其他Linux桌面的信息,请参阅您感兴趣的桌面文档。
通常情况下,用户不直接使用可执行文件,而是通过点击桌面上的图标来启动应用程序。这些图标是包含带有关于它的图标信息的应用程序的描述表示的“桌面项” 文件。这两种桌面环境都能够在这些文件中检索信息,并且可以用它们来生成应用程序的快捷方式到桌面上,在开始菜单中,或者在面板上。
有关桌面项文件的更多信息,可以在Desktop EntrySpecification中找到。
虽然桌面项文件可以有效地封装应用程序的详细信息,我们仍然需要将图标存储在每个桌面环境中的常规位置。用于图标的一些位置在Icon ThemeSpecification中给出了。
虽然用于定位图标的路径依赖于在桌面上的使用和它的配置,下面所有这些目录结构应该遵循相同的模式:子目录都按照主题,图标大小和应用程序类型进行组织。 通常,应用程序图标被添加到高彩主题,因此方形的应用程序图标的大小为32像素,它将被存储在hicolor/32x32/apps目录的图标路径的下方。
1、 K桌面环境(KDE)
应用程序图标可以被所有用户或者一个单一的用户安装使用。当前登录到他们的KDE桌面的用户可以通过使用kde-config发现这些位置,例如,通过在终端窗口中键入执行下列操作:
kde-config --pathicon
通常情况下,被输出到stdout的以冒号分隔的路径列表中包含了用户特定的图标路径和全系统的路径。下面这些目录中,可以根据在Icon ThemeSpecification中描述的约定来定位并安装图标。
如果您正在专门为KDE开发,你不妨利用KDE build system的优势来配置您的应用程序。这可以确保你的图标被安装在KDE的适当位置。
KDE的开发者网站是http://developer.kde.org/。
2、 GNOME
应用程序图标都存储在包含与体系结构无关文件的一个标准全系统目录下。这个位置可以通过使用gnome-config来确定,例如,通过在一个终端窗口中键入以下命令:
gnome-config–datadir
输出在标准输出stdout的路径指的是包含一个名为pixmaps目录的位置;这个pixmaps目录中的目录结构中在Icon ThemeSpecification中进行了描述。
如果您正在专门为GNOME开发,你可能希望使用一组标准的GNU Build Tools,在GTK+/GnomeApplication Development book的相关章节也作了说明。这可以确保你的图标被安装在为GNOME中的适当位置。
注意将运行程序编译方式设置成Release,因为debug版本的程序中包含了调试信息,可以用来调试。而真正要发布程序时,要使用release版本,这样可以减少发布程序的体积同时增加软件的安全。
上图演示在Qt Creator中的设置方式,选中IDE左边的侧边栏的项目,然后再构建设置中将构建配置设置为Release。
安装QT SDK 后,默认采用的是动态链接库的编译方式,如果需要发布程序,需要在可执行的文件中添加必须的动态链接库,然而有些动态链接库文件很大,这并不是我们想要的结果。
最好的办法是提交一个静态链接的程序。但是安装的Qt是动态编译的,要生成静态的版本,就需要自己重新进行编译。
静态编译
l 优点,发布简单,单一文件。
l 缺点,库文件很大,更新程序版本不方便。每次升级,都要重新分发所有的内容。
静态发布虽然不需要较多的dll,发布简单、方便,但是往往会牵扯到授权问题(详情请查看Qt LGPL授权),动态发布则可以避免。。。如果附带了Qt的dll,就相当于发布了Qt的dll,而這些库是属于Qt的,这足以保证使用者知道程序使用了LGPL版本的Qt。
静态编译首先需要将
mingw平台静态编译,在编译Qt的时候,有个configure.exe程序,
configure.exe-static -platform win32-g++
可以产生静态编译项目文件。然后,
mingw32-makesub-src
就可以编译出静态库。如果只是用来分发程序,也可以mingw32-makerelease sub-src只编译一个静态库。
VC2015平台,在编译Qt的时候,configure.exe-static-platform win32-msvc2015
然后nmakesub-src或者nmake release sub-src完成静态编译。
再然后,就是把你的程序重新用静态编译的Qt再编译一次。
你会得到一个非常大的可执行程序。推荐使用AspPack压缩一下。就可以发给用户了。
1、下载源安装程序,如 qt-everywhere-opensource-src-5.5.1.tar.gz
2、解压到某一目录
3、cd 进入解压后的目录,命令:
./configure-static -release -qt-zlib -qt-gif -qt-libpng -qt-libmng -qt-libjpeg -nomakedemos -nomake examples -qt-sql-sqlite -prefix /usr/local/Trolltech/Qt-5.5.1_static
参数-static 指的是要采用静态编译Qt的方法
参数-release指的是只编译release版本的库
参数-qt-zlib -qt-gif-qt-libpng -qt-libmng -qt-libjpeg 是更好确定Qt编译出的程序能在目前不知的系统下运行。
参数-nomake demos-nomake examples 指的是不编译demos和examples
参数-qt-sql-sqlite 如果没有这个参数,configure的时候,可能会提示sqlite 有问题而中止。
参数 -prefix/usr/local/Trolltech/Qt-5.5.1_static 指明静态编译的Qt安装的目录,命名Qt-5.5.1_static是为了区别动态编译安装的Qt,因为如果没有这个参数,安装时会覆盖之前动态编译安装的Qt(如果有的话)。
u 注: 如果出现错误:Basic XLibfunctionality test failed!
You might need to modify theinclude and library search paths by editing
QMAKE_INCDIR_X11 andQMAKE_LIBDIR_X11
解决办法:yum installlibX*
(如果是Ubuntu也可运行sudo apt-getinstall libx11-dev libxext-dev libxtst-dev)
4、没问题后
make
5、make没问题后再
sudo make install
6、增加(或改变)环境变量: (也可以不添加环境变量,使用绝对路径进行编译),在你home目录下你的的名字的目录中,在.profile文件中追加(或改变)如下环境变量:(为Qt设置一些特定的环境变量,这个很重要!.profile文件是隐藏的,可在你的名字目录下,按Ctrl+H显示所有文件查看到)
QTDIR=/usr/local/Trolltech/Qt-5.5.1_static/
PATH= Q T D I R / b i n : QTDIR/bin: QTDIR/bin:PATH
MANPATH= Q T D I R / d o c / m a n : QTDIR/doc/man: QTDIR/doc/man:MANPATH
LD_LIBRARY_PATH= Q T D I R / l i b : QTDIR/lib: QTDIR/lib:LD_LIBRARY_PATH
export QTDIR PATHMANPATH LD_LIBRARY_PATH
7、重启
8、在终端测试一下qmake
在MAC OS X系统平台下静态编译QT应用还是比较麻烦的,首先需要静态编译QT应用依赖的各个库,然后再进行连接生成运行文件,具体步骤参看链接:http://doc.qt.io/qt-5/osx-deployment.html。
l 优点,更新方便,发布多个产品时,可以统一使用一个库。
l 缺点,文件多、杂。
Qt官方开发环境默认使用动态链接库方式,在发布生成的可执行程序时,我们需要复制一大堆动态库,如果自己去复制动态库,很可能丢三落四,导致程序在别的电脑里无法正常运行。 因此 Qt 官方开发环境里自带了一个部署工具来帮助开发者自动拷贝大部分的依赖库。在不同的平台使用方式也有所不同。
Windows开发环境下windeployqt工具 (如果你已经将Qt的bin目录加入PATH环境,那么你可以直接在命令行使用windeployqt调用.)。首先,将项目中的release文件中的可执行文件拷到一个新建的文件夹中,例如project.exe,用Qt自带的生成必备的dll文件的程序windeployqt,来把必要的动态库拷到该文件夹中,打开命令行,输入windeployqtproject.exe,这时候大部分的dll文件都自动拷贝过来了,但是如果项目还用了一些其他的SDK,比如OpenCV,Chartdir51等等,就需要手动将所需dll拷贝过来,如果不知道还需要哪些软件,可以用Dependency Walker来查看缺少哪些dll文件。
拷贝完成后文件夹下的文件清单如下:
注意:如果发布的应用是Qt Quick Application应用,那么命令行需要加上QML的安装目录。命令中的D:\Qt\Qt5.5.1\qml是qml的安装目录,请换成你自己的qml安装目录!!!
windeployqt hello.exe–qmldir D:\Qt\Qt5.5.1\qml
接下来要高大上的朋友就可以用Enigma VirtualBox软件虚拟化工具将多个文件封装到应用程序主文件,从而制作成为单执行文件的绿色软件。
在X11平台下qt程序,首先准备好程序中需要使用的资源,库和插件…,比如你的可运行程序取名叫作panel,那把你的panel,那些libQt*.so.4和libQt*.so.4.6.0(链接和共享库都要)放在同一目录下(也可以不同,只要小小修改下shell文件).plugins就不多说了。
在程序的同目录下,新建一個空文档,取名panel.sh (文件名与程序名同名,扩展名为sh,shell文件)。在panel.sh中原封不动的写入以下语句:
#!/bin/sh
appname=`basename $0 | sed s,/.sh$,,`
dirname=`dirname$0`
tmp="${dirname#?}"
if ["${dirname%$tmp}" != "/" ]; then
dirname=$PWD/$dirname
fi
LD_LIBRARY_PATH=$dirname
export LD_LIBRARY_PATH
$dirname/$appname$*
保存文件,退出。在终端給文件+x属性: 切换到程序的目录,输入
chmod +x panel.sh
然后运行shell文件就行了(确保panel程序具备X属性),它会自动更改环境变量,运行程序。
如果要调试shell文件,只需要在终端输入:
sh -x panel.sh
这样就ok了。
如果需要把执行程序制作成DEB或RPM包的话请参考链接:
Deploying aQt5 Application Linux: https://wiki.qt.io/Deploying_a_Qt5_Application_Linux
由于Qt的库并不是OS X标配的,所以我们要自己去复制库到app包里,才可以让app在其他未安装Qt的电脑上运行。
比较幸运的是,Qt为我们提供了macdeployqt工具,借助于此,在OS X上发布Qt写的程序几乎是所有平台中最简单的。
注:我电脑配置了Qt的bin环境,所以可以直接使用macdeployqt,如果没配置,可以用绝对路径去找。
1.发布widgets程序
a) 这个比较方便。选择Release模式,编译
b) 运行macdeployqt
对于我的工程,命令是:
macdeployqt /Users/Ocean/Desktop/build-untitled-Desktop_5_5_1_64bit-Release/untitled.app-dmg
然后回车,就打包好了。之后我们会发现,app目录下多了一个dmg文件
此dmg文件,里面的app就是我们发布的app了。把dmg拷贝给别人,别人就可以直接使用了。
l 注:如果直接拷贝app文件给别人,别人是无法直接运行的,会有权限问题(要用chmod给可执行文件加上x权限才可以运行)。而压缩过(zip或者dmg)后,拷贝给别人,别人是可以直接运行,没有权限问题。
l 注:-dmg的意思就是在拷贝好库后,生成一个dmg文件,可以不加这个参数。
2.发布quick2程序
这个相对麻烦一点
a) 选择Release模式,编译
b) 打开终端,先切换编译的目标目录下
对于我的工程,命令是:
cd /Users/Ocean/Desktop/build-untitled-Desktop_5_5_1_64bit-Release
c) 运行macdeployqt
对于我的工程,命令是:
macdeployqt untitled.app-qmldir=../untitled -dmg
然后回车,就打包好了。
注1:和widgets发布程序不同,untitled.app 这个名字,要直接输入,不要写 ./untitled.app 或者是其他的 绝对/相对 路径,不然打包出来的文件无法使用!!会报错!!!
注2:-qmldir=…/untitled的意思就是说在…/untitled 目录下有qml文件,让macdeployqt去分析它们,把要用的库找过来。
首先有以下几点需要注意:
1,你的程序是否包含了第三方库?比如我这次发布的程序,程序就调用了第三方库;
2,若没包含第三方库,在Mac下发布Qt程序还是很容易的,直接使用macdeployqt命令即可;参数:xxx.app -verbose=1 -dmg
3, 图标添加方式:
.pro中添加:ICON = xxx.icns
工程中添加文件源文件:右键add就行
widget.ui中windowIcon属性添加xxx.icns文件
如果图标没有出现,删除 build debug 文件即可
如果只用了qt的库,直接用macdeployqt打包就可以了,会按照苹果要求的目录结构把库都拷进去;
如果程序中用到了第三方的库,则先执行步骤1,再把用到的库拷进.app/Contents/Frameworks/目录下;
这里注意一点:需要修改库的包含路径 用otool -L( 例:otool -L myApp.app/Contents/MacOS/myApp )命令来查看程序依赖库,把第三方库的加载路径改成跟QT自带的库一样,.app/Contents/Frameworks/目录为:@rpath/;这里还有一个问题,就是第三方库可能还有些依赖库,跟上面方法一样,拷进来然后修改依赖关系;修改指令如下:
install_name_tool -change “/usr/local/lib/libusb-0.1.4.dylib”(原依赖路径) “@executable_path/libusb-0.1.4.dylib”(新的依赖路径) ./bin/Release/libGinkgo_Driver.dylib(修改的文件);
注:修改一次保存起来,以后再打新包直接拷贝就可以了;
打包注意点:
1,使用macdeployqt打包程序,比如我编译后的程序名字叫Bootloader,那么我可以用如下命令:macdeployqt Bootloader.app,该命令执行后在程序输出目录就有个Bootloader.app文件,如果你没调用第三方库,那么应用程序对Qt的依赖库会自动打包到这个文件里面,把这个文件拷贝给别人就可以直接运行了,如果你想打包成dmg格式的文件,则可以使用:macdeployqt Bootloader.app -verbose=1 -dmg,该命令执行后就会在程序输出目录产生一个Bootloader.dmg的文件。
Qt技巧:如何在程序编译成功后自动执行这些命令?你只需要在Qt构建步骤里面添加自定义步骤即可,比如要执行macdeployqt Bootloader.app -verbose=1 -dmg命令,我们可以选择添加自定义步骤,然后命令填macdeployqt,参数填Bootloader.app -verbose=1 -dmg,如此即可实现编译完程序后自动执行该命令。
如图所示为我在Mac下添加的命令:
2,由于我使用到了第三方库,macdeployqt可能不能找到第三方库,这样该命令也不会把这个第三方库打包到Bootloader.app里面,在其他没有这个第三方库的机器上运行可能就会提示找不到这个库而导致程序不能正常运行,因此我们需要拷贝第三方库到Bootloader.app里面,Bootloader.app本质上就是一个文件夹(按照windows系统的理解,不一定准确),我们可以看到Bootloader.app的目录组织结构,一般情况下如下图所示:
应用程序一般都是放到MacOS目录下面的,Mac下的程序和windows下的程序不一样,在windows下,一般只需要把第三方库(.dll的文件)放到程序目录即可,但是在Mac下却不行,我们可以用otool -L命令来查看程序依赖库,比如在这里我们使用命令:
otool -L Bootloader.app/Contents/MacOS/Bootloader
比如在这里我们使用otool -L Bootloader.app/Contents/MacOS/Bootloader 命令,输出如下信息:
Bootloader.app/Contents/MacOS/Bootloader:
@executable_path/../Frameworks/libusb-0.1.4.dylib (compatibility version 9.0.0, current version 9.4.0)
bin/Release/libGinkgo_Driver.dylib (compatibility version 0.0.0, current version 0.0.0)
@executable_path/../Frameworks/QtWidgets.framework/Versions/5/QtWidgets (compatibility version 5.3.0, current version 5.3.1)
@executable_path/../Frameworks/QtGui.framework/Versions/5/QtGui (compatibility version 5.3.0, current version 5.3.1)
@executable_path/../Frameworks/QtCore.framework/Versions/5/QtCore (compatibility version 5.3.0, current version 5.3.1)
/System/Library/Frameworks/OpenGL.framework/Versions/A/OpenGL (compatibility version 1.0.0, current version 1.0.0)
/System/Library/Frameworks/AGL.framework/Versions/A/AGL (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 56.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 169.3.0)
其中libGinkgo_Driver.dylib即为我们所调用的第三方库,这个路径是不是感觉有点奇怪?不管他那么多了,我现在就想类似于windows这样,将这个库放到和可执行程序一个目录即可,所以我想把这个路径变为@executable_path/libGinkgo_Driver.dylib,这时候就需要使用到另外一个命令install_name_tool,这个命令也需要添加到Qt的自定义命令列表里面,添加方式同上,其完整命令为:
install_name_tool -change "bin/Release/libGinkgo_Driver.dylib" "@executable_path/libGinkgo_Driver.dylib" Bootloader.app/Contents/MacOS/Bootloader
这个命令的意思就是说将程序依赖的bin/Release/libGinkgo_Driver.dylib库更改为@executable_path/libGinkgo_Driver.dylib库,如此,Bootloader.app/Contents/MacOS/Bootloader这个程序运行的时候就会到当前目录寻找libGinkgo_Driver.dylib库,所以我们又需要把这个库拷贝到程序目录Bootloader.app/Contents/MacOS下面,这时候又要使用一个拷贝的命令了,用过linux的都应该知道是cp吧,完整命令如下:
cp ../Bootloader/lib/libGinkgo_Driver.dylib Bootloader.app/Contents/MacOS/
../Bootloader/lib/libGinkgo_Driver.dylib即为第三方库所在位置,Bootloader.app/Contents/MacOS/即为要拷贝的目的位置,当然这个命令也需要添加到Qt自定义命令列表下面。
这里还有一个小问题,因为libGinkgo_Driver.dylib这个库又调用了libusb-0.1.4.dylib库,我们用命令otool -L libGinkgo_Driver.dylib 得倒如下信息:
libGinkgo_Driver.dylib:
bin/Release/libGinkgo_Driver.dylib (compatibility version 0.0.0, current version 0.0.0)
/usr/local/lib/libusb-0.1.4.dylib (compatibility version 9.0.0, current version 9.4.0)
/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 56.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 169.3.0)
由此可见,libGinkgo_Driver.dylib库需要依赖/usr/local/lib/libusb-0.1.4.dylib库,我又用上面的方法(install_name_tool 命令)将这个目录改成当前目录,所以我执行如下命令:
install_name_tool -change "/usr/local/lib/libusb-0.1.4.dylib" "@executable_path/libusb-0.1.4.dylib" ./bin/Release/libGinkgo_Driver.dylib
再次运行命令otool -L libGinkgo_Driver.dylib就输出如下信息了:
libGinkgo_Driver.dylib:
bin/Release/libGinkgo_Driver.dylib (compatibility version 0.0.0, current version 0.0.0)
@executable_path/libusb-0.1.4.dylib (compatibility version 9.0.0, current version 9.4.0)
/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 56.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 169.3.0)
如此再将libusb-0.1.4.dylib库拷贝到程序目录即可,用cp命令,完整命令如下:
cp Bootloader.app/Contents/Frameworks/libusb-0.1.4.dylib Bootloader.app/Contents/MacOS/
我们再用命令hdiutil将Bootloader.app打包成dmg文件,完整命令如下:
hdiutil create -format UDBZ -quiet -srcfolder Bootloader.app Ginkgo_Bootloader_Mac_v2.7.29.dmg
最后在程序目录就输出了Ginkgo_Bootloader_Mac_v2.7.29.dmg文件,这个就类似于windows下的程序安装包。
下图为Qt下的所有自定义步骤:
第一个命令生成.app程序包
第二个命令更改程序依赖库路径
第三,第四个命令拷贝程序依赖库到指定位置
第五个命令将.app程序包再压缩打包为dmg文件
参考链接:
http://qt-project.org/doc/qt-4.8/deployment-mac.html
http://www.cnblogs.com/E7868A/archive/2012/12/02/2798225.html
签名相对比较复杂些:
指令:codesign --entitlements ${entitlementPath} -s "${cert}" ${frameworkpath}*
注:${entitlementPath}:entitlements文件的路径,表示该应用使用电脑的一些权限(iCloud、push notification、App沙盒等),可以用xcode创建一个新的项目,直接拷贝过来使用;
${cert}: 证书名称,这里用的是Developer Application 如:3rd Party Mac Developer Application: … Limited (JTS5ZE6933)
${frameworkpath}: 库存放的目录:.app/Contents/Frameworks/
对App签名:
codesign --deep --entitlements ${entitlementPath} -s "${cert}" ${apppath}
注:${apppath}: .app的路径 其它同上
打成pkg安装包:
productbuild --component a p p p a t h / A p p l i c a t i o n s − − s i g n " {apppath} /Applications --sign " apppath/Applications−−sign"{certInstall}" myApplication.pkg
${certInstall}: Developer Installer证书,这里跟上面不一样:
3rd Party Mac Developer Installer: ... Limited (JTS5ZE6933)
使用Application Loader工具上传打包好的.pkg文件,这里我碰到过两个问题:
一直提示info.plist为macOS程序,但是包为ipa文件:我这边是Application Loader的问题,下载了3.1版本的这个问题就没有了;
程序中用到了QtWebEngine,在QtWebEngineCore.framework中包含了QtWebEngineProcess.app的应用,这里一直提示:
需要修改QtWebEngineProcess.app里面info.plist的CFBundleIdentifier值,把’org.qt-project.Qt.QtWebEngineProcess’ 改成’org.qt-project.Qt.myApp.QtWebEngineProcess’ ;
打包脚本:
# 打包脚本:
#!/bin/sh
/Users/my/Qt5.9.3/5.9.3/clang_64/bin/macdeployqt /Users/my/Documents/chenmq/work/build-myApplication-Desktop_Qt_5_9_3_clang_64bit-Release/myApplication.app
install_name_tool -change libqiniu.so @rpath/libqiniu.so /Users/my/Documents/chenmq/work/build-myApplication-Desktop_Qt_5_9_3_clang_64bit-Release/myApplication.app/Contents/MacOS/myApplication
cp /Users/my/Documents/chenmq/QtTest/build-myApplication-Desktop_Qt_5_9_3_clang_64bit-Release/myApp.app/Contents/Frameworks/* /Users/my/Documents/chenmq/work/build-myApplication-Desktop_Qt_5_9_3_clang_64bit-Release/myApplication.app/Contents/Frameworks/
签名脚本:
apppath="/Users/my/Documents/chenmq/work/build-myApplication-Desktop_Qt_5_9_3_clang_64bit-Release/myApplication.app"
frameworkpath="${apppath}/Contents/Frameworks/"
pluginpath="${apppath}/Contents/PlugIns/"
cert="3rd Party Mac Developer Application: mingquan(Hong Kong) Limited (JTS5ZE6933)"
certInstall="3rd Party Mac Developer Installer: mingquan(Hong Kong) Limited (JTS5ZE6933)"
entitlementPath="/Users/my/Desktop/mymac/mymac/mymac.entitlements"
codesign --entitlements ${entitlementPath} -s "${cert}" ${frameworkpath}*
codesign --entitlements ${entitlementPath} -s "${cert}" ${pluginpath}accessible/*
codesign --entitlements ${entitlementPath} -s "${cert}" ${pluginpath}audio/*
codesign --entitlements ${entitlementPath} -s "${cert}" ${pluginpath}imageformats/*
codesign --entitlements ${entitlementPath} -s "${cert}" ${pluginpath}mediaservice/*
codesign --entitlements ${entitlementPath} -s "${cert}" ${pluginpath}platforms/*
codesign --entitlements ${entitlementPath} -s "${cert}" ${pluginpath}printsupport/*
codesign --entitlements ${entitlementPath} -s "${cert}" ${pluginpath}sqldrivers/*
codesign --deep --entitlements ${entitlementPath} -s "${cert}" ${apppath}
productbuild --component ${apppath} /Applications --sign "${certInstall}" myApplication.pkg
参考文档:
打包:https://blog.csdn.net/imxiangzi/article/details/50994466
https://blog.csdn.net/casun_li/article/details/71741968
签名:https://www.apps121.com/2017/12/22/qtmacappstore/
https://stackoverflow.com/questions/32379982/api-calls-dont-run-when-i-codesign-my-mac-os-x-app