文章目录
- [win 系统中项目的发布](#win 系统中项目的发布)
-
- [使用windeployqt发布 Qt 应用程序](#使用windeployqt发布 Qt 应用程序)
-
- 制作安装文件
-
- ubuntu系统中项目的发布
-
win 系统中项目的发布
- Qt 项目被以 Release 模式构建后会生成可执行文件,如果我们在 Windows 的资源管理器里直接双击这个可执行文件,系统会提示找不到一些 DLL 文件,程序无法运行。这是因为用 Qt开发的应用程序在运行时需要用到 Qt 运行库(run-timelibraries),而这些库的路径并没有被添加到系统的搜索路径里。解决方式之一是将 Qt 运行库的路径添加到系统的 PATH 环境变量里,例如Qt 6.2.4 MinGW 64-bit 的运行库的路径是:
bash
复制代码
C:\Qt\6.2.4\mingw_64\bin
- 如果要将使用 Qt 开发的应用程序发布给用户,在其他计算机上运行,就需要将 Qt 的运行库随应用程序一起发布给用户。所以发布应用程序的第一步就是提取应用程序需要的 Qt 运行库文件,Qt 提供了相关的工具软件来完成这个工作。
- 提取了 Qt 运行库文件后,将应用程序和运行库直接复制到用户计算机上就可以运行。如果要稍微正式一点,可以制作一个安装文件,有很多制作安装文件的工具软件。如果在安装 Qt 时选择了安装 Qt Installer Framework,我们也可以使用 Qt 自带的这个工具软件制作应用程序的安装文件
使用windeployqt发布 Qt 应用程序
- Qt 应用程序的发布就是提取应用程序相应开发套件的 Qt 运行库文件,使应用程序能直接在用户计算机上运行
- windeployqt.exe 是 Qt 自带的 Windows 平台发布工具,它可以为 Qt 应用程序复制其运行所需要的各种库文件、插件和翻译文件,生成可发布的文件和目录。windeployqt.exe 在 Qt 开发套件的bin 目录下
- 语法格式如下:
bash
复制代码
windeployqt [options] [files]
files, #是需要生成发布文件的应用程序文件名
optins,
--release 发布 Release 版本的二进制文件
--no-translations 忽略翻译相关的文件
--no-virtualkeyboard 忽略虚拟键盘相关的文件
构建步骤
- 将新构建处理的可执行程序放入一个新建目录
- 运行程序报错找不到...dll库时,将提示缺少的库文件从
C:\Qt\6.2.4\mingw_64\bin拷贝到当前目录下来
- 将整个文件夹复制到其他没有安装 Qt的计算机上也可以运行即可
制作安装文件
- Qt Installer Framework(以下简称 QIF)是 Qt 提供的一个制作安装文件的工具,在安装 Qt 时可以选择安装 QIF。QIF 提供了一些工具软件,这些工具软件存储在如下的目录里
- QIF 可以为任何需要发布的内容制作安装文件,而不仅是为 Qt 开发的应用软件制作安装文件。QIF 具有如下功能和特点
- 使用 QIF 可以制作离线安装文件,也可以制作在线安装文件
- 安装的内容可以划分为多个模块和层级,并且可以设置依赖性,安装过程中可以选择安装模块
- 安装向导的定制性很强,可以使用自定义 UI 文件,可以通过脚本程序添加交互操作功能。
- 可以用多语言开发工具 lupdate 和 lrelease 生成翻译文件,使安装向导具有本地化语言界面
- 用 QIF 生成的安装文件在安装时,会自动安装一个工具软件 maintenancetool.exe,运行它可以添加、移除、更新或完全卸载软件
制作步骤
第一步:准备文件夹
- 再新建一个目录Installer(可以自定义)目录,在Installer目录下创建一个名称为PlayerInstaller.pro(可以自定义)的文件
- 在此目录下创建文件夹config和packages, 这两个目录名字固定不能修改
- config 文件夹里一般只有一个文件 config.xml,包含整个安装程序的一些配置内容
- packages文件夹里是需要安装的组件,组件就是可选的安装内容。每个组件是一个文件夹。每个组件对应的个文件夹下面各有两个固定名称的文件夹:data 和 meta。data 文件夹里是需要安装到用户计算机上的文件,meta 文件夹里是对组件进行配置的文件
第二步:编写构建文件和配置文件
bash
复制代码
TEMPLATE = aux #项目模板类型
INSTALLER = VideoPlayer_installer #生成的安装文件名,如VideoPlayer_installer.exe
INPUT = $$PWD/config/config.xml $$PWD/packages
demo.input = INPUT
demo.output = $$INSTALLER
demo.commands = C:/Qt/Tools/QtInstallerFramework/4.6/bin/binarycreator -c // 根据实际情况替换
$$PWD/config/config.xml -p $$PWD/packages ${QMAKE_FILE_OUT}
demo.CONFIG += target_predeps no_link combine
QMAKE_EXTRA_COMPILERS += demo
- 修改安装配置文件 config.xml,文件 config.xml 中可设置的元素的全部定义可参见 QIF 的帮助文档
- 定义了应用程序的名称
- 定义了 安装向导的标题
- 定义了在开始菜单中创建的文件夹名称
- 定义了初始的安装文件夹,其中"@HomeDir@"表示使用QIF 中的预定义变量HomeDir,也就是用户主目录
- 设置是否要建立本地仓库,若设置为true,则完成安装后,用户可以运行维护工具来添加或删除组件
- 设置安装向导的样式,有 Modern、Mac、Aero 和 Classic 几种样式,默认是 Aero 样 式
- 设置是否显示窗口左侧的向导页面列表,默认是显示的
- 设置向导窗口默认宽度,设置向导窗口默认高度。
bash
复制代码
<?xml version="1.0" encoding="UTF-8"?>
<Installer>
<Name>Video Player</Name>
<Version>1.0.0</Version>
<Title>Video Player Created by Qt 6</Title>
<Publisher>WWB</Publisher>
<StartMenuDir>Qt6 Samples</StartMenuDir>
<TargetDir>@HomeDir@/Qt6Samples</TargetDir>
<CreateLocalRepository>true</CreateLocalRepository>
<WizardStyle>Aero</WizardStyle>
<WizardShowPageList>true</WizardShowPageList>
<WizardDefaultWidth> 650 </WizardDefaultWidth>
<WizardDefaultHeight> 430 </WizardDefaultHeight>
</Installer>
第三步:配置组件
- 将每个组件压缩为名称.7z格式,复制到packages目录下每个组件的data目录下(必须压缩为 7z 格 式)
- 每个组件的 meta 目录下必须有一个文件 package.xml
bash
复制代码
<?xml version="1.0"?>
<Package>
<DisplayName>Video Player</DisplayName>
<Description>Video Player应用程序</Description>
<Version>1.0.0</Version>
<ReleaseDate>2023-09-10</ReleaseDate>
<Licenses>
<License name="GNU Public License Agreement" file="license.txt" />
</Licenses>
<ForcedInstallation>true</ForcedInstallation>
<Script>installscript.qs</Script>
<SortingPriority>100</SortingPriority>
</Package>
- 文件 license.txt 里是安装过程中显示的许可协议内容,文件 installscript.qs 是一个 Qt 脚本文件,用于为安装后的文件创建开始菜单快捷方式和桌面快捷方式
- 定义了许可协议,文件 license.txt 中的内容就是许可协议。定义是否强制安装该组件,强制安装的组件前面不会出现复选框。
javascript
复制代码
function Component()
{
// default constructor
}
Component.prototype.createOperations = function()
{
// call default implementation to actually install VideoPlayer.exe!
component.createOperations();
if (systemInfo.productType === "windows") {
component.addOperation("CreateShortcut", "@TargetDir@\\VideoPlayer.exe",
"@StartMenuDir@\\Video Player.lnk",
"workingDirectory=@TargetDir@");
component.addOperation("CreateShortcut", "@TargetDir@\\VideoPlayer.exe",
"@DesktopDir@\\Video Player.lnk",
"workingDirectory=@TargetDir@");
}
}
- 以上脚本程序为安装后的文件创建了开始菜单快捷方式和桌面快捷方式。在创建桌面快捷方式的代码中,第一个参数表示操作名称,"CreateShortcut"就表示创建快捷方式; 第二个参数表示源文件,也就是表示安装之后的文件 ;第三个参数表示快捷方式的名称,QIF 的预定义变量 DesktopDir 表示用户桌面目录;第四个参数表示程序工作路径
第四步:编译生成文件
- 准备好这些文件后,在Qt Creator中打开文件PlayerInstaller.pro,构建项目
- 项目构建成功后会生成文Player_installer.exe,这就是制作好的安装文件。运行这个文件就可以开始安装。安装完成后会在开始菜单中创建文件夹 Qt6 Samples,为文件 Player.exe 创建开始菜单快捷方式和桌面快捷方式。根目录下有一个文件 maintenancetool.exe,是 QIF 自动安装的一个文件,运行这个文件就可以打开安装向导,可以添加或删除组件,或完全卸载软件
ubuntu系统中项目的发布
- 在windows下Qt官方提供了windeployqt工具,可以通过简单的cmd命令实现Qt程序的打包发布,绝大部分情况下能正常工作(使用msvc编译器的话有可能需要在目标机上安装vs运行库)
- 而在linux中官方没有提供类似的工具
- 目前qt程序在Ubuntu上打包共有三种方法------脚本法、静态编译法和linuxdeployqt工具法
- 不管使用哪种方式,其遵循的原则都是:
- 编程release版本可执行程序
- 找出可执行程序所有依赖的链接库
- 压缩或者打成deb包
制作步骤
- QtCreator中编译生成release版本的程序
- 建立单独文件夹将release版本可执行程序拷贝到该目录下
bash
复制代码
cd /tmp
mkdir release
cp ~/release/player
cd release
bash
复制代码
sudo apt install qt6-base-dev
sudo vim /usr/lib/x86_64-linux-gnu/qt-default/qtchooser/default.conf
/opt/Qt/6.2.4/gcc_64/bin/
/usr/lib/x86_64-linux-gnu
- 在release目录下准备脚本实现共享库的整理,以下脚本本质是使用ldd命令查找程序依赖的动态库,再把动态库复制到程序目录。vim prepare.sh:
bash
复制代码
#!/bin/bash
LibDir=$PWD"/lib"
Target=$1
lib_array=($(ldd $Target | grep -o "/.*" | grep -o "/.*/[^[:space:]]*"))
$(mkdir $LibDir)
for Variable in ${lib_array[@]}
do
cp "$Variable" $LibDir
done
bash
复制代码
chmod +x prepare.sh
./prepare.sh player
bash
复制代码
#!/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/lib
export LD_LIBRARY_PATH
$dirname/$appname
bash
复制代码
chmod +x player.sh
bash
复制代码
cp /opt/Qt/6.2.4/gcc_64/plugins/platforms/ ./ -a
bash
复制代码
./player.sh
bash
复制代码
cd ..
tar cjvf player.tar.bz2 release
#拷贝到其它ubuntu系统后 执行解压运行
tar xf player.tar.bz2
release/player.sh