一、准备需要打包的文件
准备可执行程序文件 使用Qt Creater或visual Studio+qt插件生成目标软件的Release版本。把生成的软件复制到一个单独的目录中。打开CMD命令行,切换到刚才创建的目录中,使用“windeployqt”命令来查找并添加当前软件的qt依赖库。命令详情如下:
windeployqt LedStripEditor.exe
命令执行完成以后,在刚才所创建的目录中就会看到添加进来的qt依赖库dll文件,以及其他配置文件。这些文件就是将来打包到安装包内的文件。执行完命令的结果如下图所示。 2. 准备图标 需要的图标包括软件图标和卸载图标。图标格式要求为ico格式,建议使用“Sib Icon Studio”这个软件来生成Ico格式的图标。
注意:如果在执行“windeployqt”命令的时候提示找不到此命令的处理方式如下: 原因是你的这个命令所在的位置没有添加到“系统环境变量”里面,导致命令行查找不到此命令。 处理办法是,找到这个命令所在的位置添加到环境变量里面,操作步骤如下。 在你的Qt安装路径中找到此命令,我的路径如下:
C:\Qt-MSVC\Qt5.12.3\5.12.3\msvc2017\bin
在文件管理器的“计算机”点右键“属性”,然后出现下图所示窗口,按图中步骤操作,即可。 选择path后,点击编辑按钮,在变量末尾加入,之前找到的命令所在路径(注意在先加分号),如下图所示: 设置完成之后,点击“确定”依次关闭打开的窗口,这时候新开一个cmd窗口,再执行“windeployqt”就可以正常使用了。
二、找不到第三方lib导致无法运行程序
如果是一般的qt应用程序,经过“windeployqt”导入qt的依赖库之后,双击应用程序,程序应该是可以正确运行起来的,但是当你的使用了第三方库的时候,则会出现如下错误对话框,如下图所示: 因此需要你找到所缺第三方库文件dll,然后复制到“应用程序”所在的目录即可。本文的测试环境是缺乏ffmpeg的dll库。如下图所示: 当然如果你一开始就是在windows下编写的qt程序,那么你在调试的时候,就会出现此问题,而不是在最终打包的时候出现。我这里是由于一开始在macOS下开发,最终在windows下发布windows版本遇到的问题。
三、安装NSIS软件,编辑NSIS配置文件
安装NSIS软件 本文使用NSIS这个软件来打包使用Qt开发的应用程序,NSIS这个软件使用简单、外观漂亮,因此选用它作为打包工具。NSIS的软件安装包可以在网上查找,同时我在csdn的资源中上传了一份方便下载,地址如下: 点击此链接获取NSIS安装包 下载好NSIS的软件安装包后,双击软件安装包安装即可,如下图所示: 编写NSIS工程配置文件 NSIS这个软件使用非常简单,只要写好配置文件,即可生成安装包。复杂的是,需要你阅读手册来学习“配置文件命令”的使用方法。一条一条学习命令那样太慢,因此有标准的模块可以用,你只要根据你的需求,更改模块的配置参数即可。我这里给提供一个我使用的模版。模版内有命令的注释,模版内容如下:
# ====================== 自定义宏 ==============================
!define PRODUCT_NAME "软件名字"
!define EXE_NAME "LedStripEditor.exe"
!define PRODUCT_VERSION "1.0.1.0"
!define PRODUCT_PUBLISHER "公司名字"
!define PRODUCT_LEGAL "公司英文缩写 2019"
!define TEMP_DIR ""
!define PUBLISHER_SHORT_NAME "公司英文缩写"
!define PRODUCT_ENGLISH_NAME "LedStripEditor"
# ===================== 外部插件以及宏 =============================
!include "MUI2.nsh"
# ===================== 安装包版本 =============================
VIProductVersion "${PRODUCT_VERSION}"
VIAddVersionKey "ProductVersion" "${PRODUCT_VERSION}"
VIAddVersionKey "ProductName" "${PRODUCT_NAME}"
VIAddVersionKey "CompanyName" "${PRODUCT_PUBLISHER}"
VIAddVersionKey "FileVersion" "${PRODUCT_VERSION}"
VIAddVersionKey "InternalName" "${EXE_NAME}"
VIAddVersionKey "FileDescription" "${PRODUCT_NAME}"
VIAddVersionKey "LegalCopyright" "${PRODUCT_LEGAL}"
# ==================== NSIS属性 ================================
# ZLIB(默认) BZIP2 LZMA
SetCompressor lzma
; 安装包名字.
Name "${PRODUCT_NAME}"
# 安装程序文件名.
OutFile "生成的安装包文件名字.exe"
# 默认安装位置.
InstallDir "$PROGRAMFILES\${PUBLISHER_SHORT_NAME}\${PRODUCT_ENGLISH_NAME}"
# 设置是否显示安装详细信息。
ShowInstDetails hide
# 设置是否显示卸载详细信息
ShowUnInstDetails hide
# 针对Vista和win7 的UAC进行权限请求.
# RequestExecutionLevel none|user|highest|admin
RequestExecutionLevel admin
# ==================== MUI属性 ==================================
# 安装和卸载程序图标
!define MUI_ICON "image\logo.ico"
!define MUI_UNICON "image\un_logo.ico"
# 如果未使用MUI,则可直接使用.onGUIInit
!define MUI_CUSTOMFUNCTION_GUIINIT onGUIInit
# 安装程序欢迎页面
!insertmacro MUI_PAGE_WELCOME
# 安装程序软件授权申明页面
#!insertmacro MUI_PAGE_LICENSE "license.rtf"
# 安装程序显示安装目录选择页面
!insertmacro MUI_PAGE_DIRECTORY
# 安装程序显示安装组件选择页面
!insertmacro MUI_PAGE_COMPONENTS
# 安装程序显示进度页面
!insertmacro MUI_PAGE_INSTFILES
# 安装程序显示安装结束页面
!insertmacro MUI_PAGE_FINISH
# 卸载程序显示进度
!insertmacro MUI_UNPAGE_INSTFILES
# 卸载程序显示安装结束
!insertmacro MUI_UNPAGE_FINISH
# 指定语言,必须在最后指定
!insertmacro MUI_LANGUAGE "SimpChinese"
# ========================= 安装步骤 ===============================
# 区段1
# 区段名以一个 ! 开头,那么该区段的显示名称将以粗体字显示.
Section "!Files" "des_files"
; 设置文件的输出路径
SetOutPath $INSTDIR
; 放置文件
File /r "app\*.*"
SectionEnd
# 区段2
Section "Shortcut" "des_shortcut"
SetShellVarContext all
CreateDirectory "$SMPROGRAMS\${PRODUCT_PUBLISHER}"
CreateShortCut "$SMPROGRAMS\${PRODUCT_PUBLISHER}\${PRODUCT_NAME}.lnk" "$INSTDIR\${EXE_NAME}"
CreateShortCut "$SMPROGRAMS\${PRODUCT_PUBLISHER}\卸载${PRODUCT_NAME}.lnk" "$INSTDIR\uninst.exe"
CreateShortCut "$DESKTOP\${PRODUCT_NAME}.lnk" "$INSTDIR\${EXE_NAME}"
SetShellVarContext current
SectionEnd
# 区段3
# 区段名为空、遗漏或者以一个 "-" 开头,那么它将是一个隐藏的区段,用户也不能选择禁止它.
Section "-Necessary"
# 生成卸载程序
WriteUninstaller "$INSTDIR\uninst.exe"
# 添加卸载信息到控制面板
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" "DisplayName" "${PRODUCT_NAME}"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" "UninstallString" "$INSTDIR\uninst.exe"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" "DisplayIcon" "$INSTDIR\${EXE_NAME}"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" "Publisher" "$INSTDIR\${PRODUCT_PUBLISHER}"
SectionEnd
# 卸载区段
Section "Uninstall"
; 删除快捷方式
SetShellVarContext all
Delete "$SMPROGRAMS\${PRODUCT_PUBLISHER}\${PRODUCT_NAME}.lnk"
Delete "$SMPROGRAMS\${PRODUCT_PUBLISHER}\卸载${PRODUCT_NAME}.lnk"
RMDir "$SMPROGRAMS\${PRODUCT_PUBLISHER}\"
Delete "$DESKTOP\${PRODUCT_NAME}.lnk"
SetShellVarContext current
SetOutPath "$INSTDIR"
; 删除安装的文件
Delete "$INSTDIR\*.*"
SetOutPath "$DESKTOP"
RMDir /r "$INSTDIR"
RMDir "$INSTDIR"
SetAutoClose true
SectionEnd
# 区段描述
!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
!insertmacro MUI_DESCRIPTION_TEXT ${des_files} "主程序文件"
!insertmacro MUI_DESCRIPTION_TEXT ${des_shortcut} "创建开始菜单和桌面快捷方式"
!insertmacro MUI_FUNCTION_DESCRIPTION_END
# ============================== 回调函数 ====================================
# 函数名以“.”开头的一般作为回调函数保留.
# 函数名以“un.”开头的函数将会被创建在卸载程序里,因此,普通安装区段和函数不能调用卸载函数,而卸载区段和卸载函数也不能调用普通函数。
Function .onInit
FunctionEnd
Function onGUIInit
FunctionEnd
# 安装成功以后.
Function .onInstSuccess
FunctionEnd
# 卸载操作开始前.
Function un.onInit
MessageBox MB_ICONQUESTION|MB_YESNO "你确实要完全删除${PRODUCT_NAME},及其所有组件吗?" /SD IDYES IDYES +2 IDNO +1
Abort
FunctionEnd
# 卸载成功以后.
Function un.onUninstSuccess
MessageBox MB_ICONINFORMATION|MB_OK "${PRODUCT_NAME} 已成功地从你的计算机移除" /SD IDOK
FunctionEnd
四、运行脚本生成安装包
把准备好的可执行软件放置到名字为“app”的目录下,把准备好的软件图标和卸载图标放置到名字为“”的目录下,然后把安装包的NSIS脚本文件与之前的两个目录放置到同一目录下,如下图所示: 然后选中脚本文件,右键选择“Compile NSIS Script”,就会自动弹出NSIS的打包进度对话框,如下图所示: 打包完会在脚本所在的目录生成“软件的安装包”,双击安装包,运行如下图所示: 安装包安装软件效果如下图所示: ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200328220321533.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3JvYmVydF9jeXN5,size_16,color_FFFFFF,t_70#pic_center)
|