Qt5 安装与配置, Qt应用打包和发布

Qt5 安装与配置

Qt安装下载:Qt官网下载

window下安装Qt5

mac下安装Qt5

Mac环境准备工作

下载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 Qt5 安装

Mac下安装 Qt需先安装Xcode Qt官网

  • 方式一: 下载dmg文件手动安装
    在这里插入图片描述

一步步按指引完成安装即可

  • 方式二:命令行安装(brew安装)

用brew的好处是稍微省心一些,不用折腾更新什么的,万一要重装什么的也可以brew bundle dump然后在新机器上brew bundle一把了事。brew安装的时候已经安装好了Xcode Command Line Tools等,必要的话把它更新一下(App Store会自动提醒)。

  1. 安装命令:
brew install qt
brew cask install qt-creator

  1. 配置
    上面两条命令之间是没有关联的,后装的qt-creator不会自动检测到前面的qt(qt这个包是QT开发工具链),所以需要配置。

首先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工具链的路径,就可以开始配置:

  • (1), 打开QT Creator的设置,到QtVersions,点击“添加”,在浏览窗口中按CMD+Shift+G,弹出“前往文件夹”对话框,输入/usr/local,点确定,浏览到/usr/local/opt/qt/bin/qmake,点确定。

在这里插入图片描述
QT Creator会自动检测到这个qt的版本。

  • (2), 此时点击刚给添加的这一行,展开下面的“详情”,可以看出,显然这套东西是Clang编译出来的:

在这里插入图片描述

  • (3), 回到前面的“构建套件”,一般装好了之后都有一个默认的“桌面”套件了,只是没有与qt工具链关联。从下拉菜单中选择刚给新加入的qt,这里是QT 5.10.0:

在这里插入图片描述

大部分其他项目留默认就好,但是:
非常重要:既然这里的qt是Clang编译出来的,那么“编译器”一栏默认的GCC当然就不合适了,必须改为Clang,参见上图。不修改的话,构建项目时会报错Project ERROR: failed to parse default search paths from compiler output.

  1. 测试
Mac下安装Homebrew工具

Homebrew官网
打开终端输入命令:

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

在这里插入图片描述

在 successful 后面还有个步骤,Terminal 中运行 brew doctor,doctor 让你的系统 ready to brew。

Mac下安装Python3.6

命令行输入:

brew install python3
Mac下Pycharm集成PyQt5
  • PyCharm :可以简单理解为编程软件,我们要下载 Community 版本。
  • PyQt: 一个 Python 插件,也可以简单理解为一座桥,连接 Pycharm 和 Qt。
  1. 下载PyCharm Community版本:PyCharm官网下载

在这里插入图片描述

  1. 安装PyQt5
    终端输入命令:
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一键就可以搭建好。

  1. 将 PyQt 加入 PyCharm 中

在这里插入图片描述
查找安装路径的命令

brew list #列出 brew 安装的内容;
which XXX # 继而输入 ,列出 XXX 所在的安装路径

配置

在这里插入图片描述
如果安装完毕,但是试运行的时候程序找不到 PyQt5,那么我们将采取如下办法手动安装:

在这里插入图片描述

选择“+”之后,进入如下页面,输入“PyQt5”并安装该 package。

在这里插入图片描述

程序会开始安装,安装成功后,程序就可以识别到 PyQt5。

测试安装:

检验是否能识别到 PyQt5
写一个小函数,函数头(函数刚开始的地方)写上 from PyQt5 import QtCore, QtGui, QtWidgets 如果程序可以正常识别(不画红色下划线),那么一般就是识别成功了

Mac Qt 环境变量配置
  1. 打开终端需要打开配置文件(注意这里不是bash_profile而是 .bash_profile
    在这里插入图片描述

  2. 如果bash_profile文件不存在,就会自动创建,然后需要输入以下内容:
    在这里插入图片描述

  3. 然后保存退出,然后输入source ~/.bash_profile使得这个文件生效。
    然后退出终端重新运行,输入
    在这里插入图片描述

  4. 测试: 输入qmake -v 可以显示版本号,则配置成功。

  5. Mac下Qt导出安装包的时候需要使用 macdeployqt ismartviewpro.app 将需要的库拷贝到沙盒中。

linux下安装Qt5
QT编译运行中的问题
1. Qt Creator 里改一下 Qt Versions
  1. 偏好设置-Kits-Qt Versions-添加路径/usr/local/Cellar/qt/5.11.2/bin/qmake

在这里插入图片描述
2. 偏好设置-Kits-构建套件(Kit)-手动设置-桌面(默认)-Qt版本-Qt 5.11.2
在这里插入图片描述

2. Qt Creator 创建项目报错
  1. 报错1:
 Project ERROR: failed to parse default search paths from compiler output
Error while parsing file /Users/hanpeizhi/Qt5/testProject01/testProject01.pro. Giving up.

解决办法:
把编译器C和C++全部改为Clang
在这里插入图片描述

  1. 报错2:sdk问题
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


  1. 报错3:

QT开发的应用程序打包发布

QT开发的程序发布的时候经常采用两种方式:

l 静态编译,可生成单一的可执行文件。

l 动态编译,需同时附上需要的dll文件。

qt开发的window应用打包发布

不管采用哪种方式,首先我们要把项目的发布做一些准备,例如:准备程序的图标,将项目编译成release等。

发布准备
1. 设置应用程序图标
1.1 设置图标(window)

应用程序的图标分两种:

  • 主窗口图标,主要在程序运行时显示在主窗口左上角,或在任务栏上显示。

首先在绘图工具(例如Photoshop)中设计好图标,图标的分辨率最好大于3232。图标需要用ico或*png的文件。如果想偷懒一点,直接去这里(http://www.iconfinder.com/)下载,大量好看免费的图标。

将刚才的生成的图标文件放到yourProjectFolder/Resources/images目录下,或者任意一个程序可以找到的位置。最好将图标文件添加到qrc中统一管理,qrc文件的格式如下:

<qresourceprefix="/background">

    <filealias="mainlogo">christmas_stocking.png</file>

</qresource>

然后再主窗口中使用,代码如下,代码很简单,不过记住这句代码一定要放到Mainwindow的构造函数里去,不然不会work。

/setwindowicon/

setWindowIcon(QIcon(QStringLiteral(":/background/mainlogo")));

程序运行后的效果如下:

在这里插入图片描述

  • 运行程序图标,一般在桌面或文件夹中显示的缩略图标,可以点击后运行程序。

设置运行程序的图标在各个平台是各不相同的,下面分别介绍。首先准备分辨率最好大于3232的图标文件。图标需要用ico的文件。

  1. 使用Visual Studio IDE开发工具

如果使用的是VisualStudio IDE开发工具,例如在VS2015中,项目上右击,添加,资源,选择icon,然后将之前准备的*ico图标文件导入,确定之后项目中就会出现一个 projectname.rc 的文件。
在这里插入图片描述

  1. 使用QTCreator的IDE开发工具

如果你是使用qmake生成makefile文件或使用QT Creator IDE,那么按下面三步实施:
l 第一步:创建一个包含图标图像的ICO文件,并将其保存在资源文件目录下,例如命名为:myapp.ico;

l 第二步:创建一个.rc文件,包含如下内容:

IDI_ICON1 ICON DISCARDABLE “myapp.ico”

l 第三步:在工程文件myapp.pro文件中写入如下内容:

RC_FILE = myapp.rc

再次编译程序,即可达到效果,效果图如下:

在这里插入图片描述

1.2 设置图标(mac)

虽然许多程序可以创建图标文件(.icns),推荐的方法是使用由苹果公司提供的程序iconutil。Iconutil是一个命令行工具,它允许您导入多个不同大小的图标(在不同的上下文中使用),并能压缩文件。在您的项目目录中将所有一系列的图标保存在一个文件中。

如果您正使用qmake生成makefile文件,您只需要将一个单一的行添加到您的.pro工程文件。例如,如果您的图标文件的名称是myapp.icns,并且您的项目文件名称是myapp.pro加入这一行到myapp.pro

ICON = myapp.icns

这将确保qmake把你的图标放在适当的位置并为图标创建一个Info.plist条目。

如果你不使用qmake,你必须手动执行以下几点:

  1. 为您的应用程序(使用PropertyListEditor,在Developer/Applications中可以找到)创建一个Info.plist文件。

  2. 在Info.plist文件(同样,使用PropertyListEditor)关联您的.icns记录和CFBundleIconFile记录。

  3. 将Info.plist文件复制到你的应用程序包的Contents目录。

  4. 复制.icns文件到你的应用程序包的Contents/Resoures目录。

1.3 设置图标(linux)

在本节中,我们简要地介绍一下在两种常见的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中的适当位置。

2. 编译release版本

注意将运行程序编译方式设置成Release,因为debug版本的程序中包含了调试信息,可以用来调试。而真正要发布程序时,要使用release版本,这样可以减少发布程序的体积同时增加软件的安全。

在这里插入图片描述

上图演示在Qt Creator中的设置方式,选中IDE左边的侧边栏的项目,然后再构建设置中将构建配置设置为Release。

在这里插入图片描述

打包发布程序

安装QT SDK 后,默认采用的是动态链接库的编译方式,如果需要发布程序,需要在可执行的文件中添加必须的动态链接库,然而有些动态链接库文件很大,这并不是我们想要的结果。

最好的办法是提交一个静态链接的程序。但是安装的Qt是动态编译的,要生成静态的版本,就需要自己重新进行编译。

1. 静态编译

静态编译
l 优点,发布简单,单一文件。
l 缺点,库文件很大,更新程序版本不方便。每次升级,都要重新分发所有的内容。

静态发布虽然不需要较多的dll,发布简单、方便,但是往往会牵扯到授权问题(详情请查看Qt LGPL授权),动态发布则可以避免。。。如果附带了Qt的dll,就相当于发布了Qt的dll,而這些库是属于Qt的,这足以保证使用者知道程序使用了LGPL版本的Qt。

1. 1 静态编译 (window)

静态编译首先需要将

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. 2 静态编译 (linux)

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

1. 3 静态编译 (mac)

在MAC OS X系统平台下静态编译QT应用还是比较麻烦的,首先需要静态编译QT应用依赖的各个库,然后再进行连接生成运行文件,具体步骤参看链接:http://doc.qt.io/qt-5/osx-deployment.html。

2. 附加Dll文件

l 优点,更新方便,发布多个产品时,可以统一使用一个库。
l 缺点,文件多、杂。

Qt官方开发环境默认使用动态链接库方式,在发布生成的可执行程序时,我们需要复制一大堆动态库,如果自己去复制动态库,很可能丢三落四,导致程序在别的电脑里无法正常运行。 因此 Qt 官方开发环境里自带了一个部署工具来帮助开发者自动拷贝大部分的依赖库。在不同的平台使用方式也有所不同。

2.1 附加Dll文件(window)

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软件虚拟化工具将多个文件封装到应用程序主文件,从而制作成为单执行文件的绿色软件。

2.2 附加Dll文件(linux)

在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

2.3 附加Dll文件(mac)

由于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去分析它们,把要用的库找过来。

qt开发的mac应用打包发布

一. 打包

首先有以下几点需要注意:

1,你的程序是否包含了第三方库?比如我这次发布的程序,程序就调用了第三方库;
2,若没包含第三方库,在Mac下发布Qt程序还是很容易的,直接使用macdeployqt命令即可;参数:xxx.app -verbose=1 -dmg

3, 图标添加方式:
.pro中添加:ICON = xxx.icns
工程中添加文件源文件:右键add就行
widget.ui中windowIcon属性添加xxx.icns文件
如果图标没有出现,删除 build debug 文件即可


  1. 如果只用了qt的库,直接用macdeployqt打包就可以了,会按照苹果要求的目录结构把库都拷进去;

  2. 如果程序中用到了第三方的库,则先执行步骤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

二. 签名
  签名相对比较复杂些:
  1. 准备好苹果的发布证书(需要开发证书和安装证书),把证书下载安装在电脑上;
    对库签名:
指令: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 &quot; {apppath} /Applications --sign &quot; apppath/Applicationssign"{certInstall}" myApplication.pkg

${certInstall}: Developer Installer证书,这里跟上面不一样:

3rd Party Mac Developer Installer: ... Limited (JTS5ZE6933)
  1. 打包过程中有个很重要的问题就是修改info.plist

在这里插入图片描述

三. 上传App Store
使用Application Loader工具上传打包好的.pkg文件,这里我碰到过两个问题:
  1. 一直提示info.plist为macOS程序,但是包为ipa文件:我这边是Application Loader的问题,下载了3.1版本的这个问题就没有了;

  2. 程序中用到了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

qt开发的linux应用打包发布

  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值