当前位置:   article > 正文

12.3-Windows下使用NSIS打包QT应用程序安装包,看这一篇就足够了(包括第三方Lib库)_createshortcut "$desktop\

createshortcut "$desktop\

一、准备需要打包的文件

  1. 准备可执行程序文件
    使用Qt Creater或visual Studio+qt插件生成目标软件的Release版本。把生成的软件复制到一个单独的目录中。打开CMD命令行,切换到刚才创建的目录中,使用“windeployqt”命令来查找并添加当前软件的qt依赖库。命令详情如下:
windeployqt LedStripEditor.exe
  • 1

命令执行完成以后,在刚才所创建的目录中就会看到添加进来的qt依赖库dll文件,以及其他配置文件。这些文件就是将来打包到安装包内的文件。执行完命令的结果如下图所示。
在这里插入图片描述
2. 准备图标
需要的图标包括软件图标和卸载图标。图标格式要求为ico格式,建议使用“Sib Icon Studio”这个软件来生成Ico格式的图标。

注意:如果在执行“windeployqt”命令的时候提示找不到此命令的处理方式如下:
原因是你的这个命令所在的位置没有添加到“系统环境变量”里面,导致命令行查找不到此命令。
处理办法是,找到这个命令所在的位置添加到环境变量里面,操作步骤如下。
在你的Qt安装路径中找到此命令,我的路径如下:

C:\Qt-MSVC\Qt5.12.3\5.12.3\msvc2017\bin
  • 1

在文件管理器的“计算机”点右键“属性”,然后出现下图所示窗口,按图中步骤操作,即可。
在这里插入图片描述
选择path后,点击编辑按钮,在变量末尾加入,之前找到的命令所在路径(注意在先加分号),如下图所示:
在这里插入图片描述
设置完成之后,点击“确定”依次关闭打开的窗口,这时候新开一个cmd窗口,再执行“windeployqt”就可以正常使用了。

二、找不到第三方lib导致无法运行程序

如果是一般的qt应用程序,经过“windeployqt”导入qt的依赖库之后,双击应用程序,程序应该是可以正确运行起来的,但是当你的使用了第三方库的时候,则会出现如下错误对话框,如下图所示:
在这里插入图片描述
因此需要你找到所缺第三方库文件dll,然后复制到“应用程序”所在的目录即可。本文的测试环境是缺乏ffmpeg的dll库。如下图所示:
在这里插入图片描述
当然如果你一开始就是在windows下编写的qt程序,那么你在调试的时候,就会出现此问题,而不是在最终打包的时候出现。我这里是由于一开始在macOS下开发,最终在windows下发布windows版本遇到的问题。

三、安装NSIS软件,编辑NSIS配置文件

  1. 安装NSIS软件
    本文使用NSIS这个软件来打包使用Qt开发的应用程序,NSIS这个软件使用简单、外观漂亮,因此选用它作为打包工具。NSIS的软件安装包可以在网上查找,同时我在csdn的资源中上传了一份方便下载,地址如下:
    点击此链接获取NSIS安装包
    下载好NSIS的软件安装包后,双击软件安装包安装即可,如下图所示:
    在这里插入图片描述
  2. 编写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


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178

四、运行脚本生成安装包

把准备好的可执行软件放置到名字为“app”的目录下,把准备好的软件图标和卸载图标放置到名字为“”的目录下,然后把安装包的NSIS脚本文件与之前的两个目录放置到同一目录下,如下图所示:
在这里插入图片描述
然后选中脚本文件,右键选择“Compile NSIS Script”,就会自动弹出NSIS的打包进度对话框,如下图所示:
在这里插入图片描述
在这里插入图片描述
打包完会在脚本所在的目录生成“软件的安装包”,双击安装包,运行如下图所示:
在这里插入图片描述
安装包安装软件效果如下图所示:
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/112668
推荐阅读
相关标签
  

闽ICP备14008679号