【问题标题】:Statically link MSVC libraries, dynamically link Qt静态链接 MSVC 库,动态链接 Qt
【发布时间】:2020-01-13 09:59:08
【问题描述】:

我正在部署我用 Qt 构建的东西,由于 LGPL,它是动态链接的。我使用windeployqt.exe 收集必要的 dll,它在 Windows 10 机器上运行良好。当我在 Windows 7 机器上尝试时,我收到了这个错误:

程序无法启动,因为您的计算机中缺少 MSVCP140.dll。

经过一番研究,发现MSVCP140.dll 是Visual Studio 安装的System 32 中的一个dll。我应该让我的客户安装 Visual Studio,这在我的情况下不是一个选项,或者静态链接它。我尝试使用/MT,但我得到了:

用 /MD 覆盖 /MT

大概是因为我不能在不静态编译 Qt 本身的情况下静态链接 Qt 库。 由于 LGPL,我想要做的是动态链接 Qt 库,并静态链接 MSVC 库。有没有办法做到这一点?最好来自 Qt 创建者。
我认为在程序中包含MSVCP140.dll 不是一种选择。

我正在使用 Visual Studio 2019 和 Qt 13.1

【问题讨论】:

  • 如果您使用 VS2015 或更高版本构建 Windows 程序,则必须在任何目标系统上安装 MSVCP140.dll(名称将根据您的构建配置而有所不同) - 除非您专门使用早期的工具集。
  • @Adrian 如何在目标系统上安装MSVCP140.dll?有没有办法将它包含在构建中或静态链接它(也没有静态链接 Qt 库)?我正在使用 Visual Studio 2019
  • 您必须重新编译 Qt 才能使用静态运行时(这与静态链接不同)。我不确定这是可能的。我的建议是将 vc_redist 与您为应用程序创建的安装程序打包在一起。我在工作中的所有应用程序中都使用 NSIS。然而,这主要是通过使用 CMake 和我十年前编写的一些 CMake 脚本为我完成的。 NSIS 不需要 CMake,因此您可以自己执行此操作。还有 WIX 和其他一些选项,例如 Qt 安装程序框架。

标签: c++ windows visual-studio qt


【解决方案1】:

为了让目标机器运行使用 Visual Studio 2015 或更高版本构建的软件,您需要在其上安装最新的 MSVC 运行时可再发行包。某些系统(例如 Windows 10)已经有足够新的版本。

您可以从此处获取最新包:vc_redist.XXX.exe,具体取决于目标平台。

选择“静态链接”选项仅适用于 MFC 库。

在 Stack Overflow 上有一个旧的 - 但可能很有帮助 - 问答 here

【讨论】:

  • 那么,解决方案是让.msi 安装程序在目标机器上安装它?
  • 方法有很多!构建一个 MSI 是其中之一,但它不是微不足道的:您必须在目标目录中包含相关的 vc_redist.x64.exe(或其他),然后将代码添加到安装程序以运行该文件。其他软件包,如WiX,可能会更容易。或者你可以告诉你的最终用户他们应该从给定的链接中运行相关的 redist。
【解决方案2】:

正如drescherjm所说,最简单的方法是使用NSIS...... 一个简单的脚本可以创建一个包含所有必要文件的包...

我创建环境变量 MSVC_FOLDER、QT_MAJOR_VERSION 等,以使该脚本与 3 个版本的 Qt(5.5.1、5.8 和 5.11)和 3 个版本的 Visual Studio(2010、2013 和 2015)一起工作...

你可以简化这一切...

示例脚本:

; Script generated by the HM NIS Edit Script Wizard.

; HM NIS Edit Wizard helper defines
!define PRODUCT_NAME "Define name"
!define PRODUCT_VERSION "0.0.0.0"
!define PRODUCT_PUBLISHER "Define..."
!define PRODUCT_WEB_SITE "http://www.define.com.br"
!define PRODUCT_DIR_REGKEY "Software\YourCompany\${PRODUCT_NAME}"
!define PRODUCT_UNINST_KEY "Software\YourCompany\Uninstall\${PRODUCT_NAME}"
!define PRODUCT_UNINST_ROOT_KEY "HKLM"

; MUI 1.67 compatible ------
!include "MUI.nsh"

; MUI Settings
!define MUI_ABORTWARNING
!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico"
!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico"

; Welcome page
!insertmacro MUI_PAGE_WELCOME
; Directory page
!insertmacro MUI_PAGE_DIRECTORY
; Instfiles page
!insertmacro MUI_PAGE_INSTFILES
; Finish page
!define MUI_FINISHPAGE_RUN "$INSTDIR\YourSistem.exe"
!insertmacro MUI_PAGE_FINISH

; Uninstaller pages
!insertmacro MUI_UNPAGE_INSTFILES

; Language files
!insertmacro MUI_LANGUAGE "PortugueseBR"

; MUI end ------

Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile "\Desenvol\Instaladores\${PRODUCT_NAME}\${PRODUCT_NAME}Setup.exe"
InstallDir "C:\${PRODUCT_NAME}"
InstallDirRegKey HKLM "${PRODUCT_DIR_REGKEY}" ""
ShowInstDetails show
ShowUnInstDetails show

Section "SeçãoPrincipal" SEC01

  !if /FileExists "\Desenvol\CPP\build-${PRODUCT_NAME}-Desktop_Qt_$%QT_MAJOR_VERSION%_$%QT_MINOR_VERSION%_$%QT_REVISION%_$%QT_COMPILER%_32bit-Release\release\${PRODUCT_NAME}.exe"
    !cd "\Desenvol\CPP\build-${PRODUCT_NAME}-Desktop_Qt_$%QT_MAJOR_VERSION%_$%QT_MINOR_VERSION%_$%QT_REVISION%_$%QT_COMPILER%_32bit-Release\"
    !system '"C:\Program Files (x86)\$%MSVC_FOLDER%\VC\bin\nmake.exe" /f Makefile clean '

    !cd "\Desenvol\CPP\build-${PRODUCT_NAME}-Desktop_Qt_$%QT_MAJOR_VERSION%_$%QT_MINOR_VERSION%_$%QT_REVISION%_$%QT_COMPILER%_32bit-Release\release\"
    !system '"C:\Qt\Qt$%QT_MAJOR_VERSION%.$%QT_MINOR_VERSION%.$%QT_REVISION%\$%QT_MAJOR_VERSION%.$%QT_MINOR_VERSION%\$%QT_COMPILER%\bin\windeployqt.exe" --qmldir ..\..\YourSistem\ . -release --no-qmltooling '
    !system 'rmdir /s /q private '
    !system 'rmdir /s /q QtGraphicalEffects '
    !system 'mkdir \Desenvol\Instaladores\${PRODUCT_NAME} '
  !endif

  !cd "${SCRIPT_FOLDER}"

  SetOutPath "$SYSDIR"
  File /nonfatal "C:\Program Files (x86)\$%MSVC_FOLDER%\VC\redist\x86\Microsoft.VC$%MSVC_RUNTIME%.CRT\msvcp$%MSVC_RUNTIME%.dll"
  File /nonfatal "C:\Program Files (x86)\$%MSVC_FOLDER%\VC\redist\x86\Microsoft.VC$%MSVC_RUNTIME%.CRT\msvcr$%MSVC_RUNTIME%.dll"
  SetOutPath "$INSTDIR"
  File /nonfatal "\Desenvol\CPP\build-${PRODUCT_NAME}-Desktop_Qt_$%QT_MAJOR_VERSION%_$%QT_MINOR_VERSION%_$%QT_REVISION%_$%QT_COMPILER%_32bit-Release\release\D3Dcompiler_43.dll"
  File /nonfatal "\Desenvol\CPP\build-${PRODUCT_NAME}-Desktop_Qt_$%QT_MAJOR_VERSION%_$%QT_MINOR_VERSION%_$%QT_REVISION%_$%QT_COMPILER%_32bit-Release\release\Qt5Core.dll"
  File /nonfatal "\Desenvol\CPP\build-${PRODUCT_NAME}-Desktop_Qt_$%QT_MAJOR_VERSION%_$%QT_MINOR_VERSION%_$%QT_REVISION%_$%QT_COMPILER%_32bit-Release\release\Qt5Gui.dll"
  File /nonfatal "\Desenvol\CPP\build-${PRODUCT_NAME}-Desktop_Qt_$%QT_MAJOR_VERSION%_$%QT_MINOR_VERSION%_$%QT_REVISION%_$%QT_COMPILER%_32bit-Release\release\Qt5Qml.dll"
  File /nonfatal "\Desenvol\CPP\build-${PRODUCT_NAME}-Desktop_Qt_$%QT_MAJOR_VERSION%_$%QT_MINOR_VERSION%_$%QT_REVISION%_$%QT_COMPILER%_32bit-Release\release\Qt5Quick.dll"
  File /nonfatal "\Desenvol\CPP\build-${PRODUCT_NAME}-Desktop_Qt_$%QT_MAJOR_VERSION%_$%QT_MINOR_VERSION%_$%QT_REVISION%_$%QT_COMPILER%_32bit-Release\release\Qt5Network.dll"
  File /nonfatal "\Desenvol\CPP\build-${PRODUCT_NAME}-Desktop_Qt_$%QT_MAJOR_VERSION%_$%QT_MINOR_VERSION%_$%QT_REVISION%_$%QT_COMPILER%_32bit-Release\release\Qt5PrintSupport.dll"
  File /nonfatal "\Desenvol\CPP\build-${PRODUCT_NAME}-Desktop_Qt_$%QT_MAJOR_VERSION%_$%QT_MINOR_VERSION%_$%QT_REVISION%_$%QT_COMPILER%_32bit-Release\release\Qt5Sql.dll"
  File /nonfatal "\Desenvol\CPP\build-${PRODUCT_NAME}-Desktop_Qt_$%QT_MAJOR_VERSION%_$%QT_MINOR_VERSION%_$%QT_REVISION%_$%QT_COMPILER%_32bit-Release\release\Qt5Svg.dll"
  File /nonfatal "\Desenvol\CPP\build-${PRODUCT_NAME}-Desktop_Qt_$%QT_MAJOR_VERSION%_$%QT_MINOR_VERSION%_$%QT_REVISION%_$%QT_COMPILER%_32bit-Release\release\Qt5Widgets.dll"

  File /nonfatal "\Desenvol\CPP\build-${PRODUCT_NAME}-Desktop_Qt_$%QT_MAJOR_VERSION%_$%QT_MINOR_VERSION%_$%QT_REVISION%_$%QT_COMPILER%_32bit-Release\release\libEGL.dll"
  File /nonfatal "\Desenvol\CPP\build-${PRODUCT_NAME}-Desktop_Qt_$%QT_MAJOR_VERSION%_$%QT_MINOR_VERSION%_$%QT_REVISION%_$%QT_COMPILER%_32bit-Release\release\libGLESV2.dll"
  File /nonfatal "\Desenvol\CPP\build-${PRODUCT_NAME}-Desktop_Qt_$%QT_MAJOR_VERSION%_$%QT_MINOR_VERSION%_$%QT_REVISION%_$%QT_COMPILER%_32bit-Release\release\opengl32sw.dll"
  File /nonfatal "\Desenvol\CPP\build-${PRODUCT_NAME}-Desktop_Qt_$%QT_MAJOR_VERSION%_$%QT_MINOR_VERSION%_$%QT_REVISION%_$%QT_COMPILER%_32bit-Release\release\${PRODUCT_NAME}.exe"
  File /nonfatal "\Desenvol\CPP\${SCRIPT_FOLDER}\*.ini"
  File /nonfatal "\Desenvol\CPP\${SCRIPT_FOLDER}\*.rwf"

  SetOutPath "$INSTDIR\QtQml\Models.2"
  File /nonfatal /r "\Desenvol\CPP\build-${PRODUCT_NAME}-Desktop_Qt_$%QT_MAJOR_VERSION%_$%QT_MINOR_VERSION%_$%QT_REVISION%_$%QT_COMPILER%_32bit-Release\release\QtQml\Models.2\*.*"

  SetOutPath "$INSTDIR\QtQuick"
  File /nonfatal /r "\Desenvol\CPP\build-${PRODUCT_NAME}-Desktop_Qt_$%QT_MAJOR_VERSION%_$%QT_MINOR_VERSION%_$%QT_REVISION%_$%QT_COMPILER%_32bit-Release\release\QtQuick\*.*"

  SetOutPath "$INSTDIR\QtQuick.2"
  File /nonfatal /r "\Desenvol\CPP\build-${PRODUCT_NAME}-Desktop_Qt_$%QT_MAJOR_VERSION%_$%QT_MINOR_VERSION%_$%QT_REVISION%_$%QT_COMPILER%_32bit-Release\release\QtQuick.2\*.*"

  SetOutPath "$INSTDIR\iconengines"
  File /nonfatal "\Desenvol\CPP\build-${PRODUCT_NAME}-Desktop_Qt_$%QT_MAJOR_VERSION%_$%QT_MINOR_VERSION%_$%QT_REVISION%_$%QT_COMPILER%_32bit-Release\release\iconengines\qsvgicon.dll"

  SetOutPath "$INSTDIR\imageformats"
  File /nonfatal "\Desenvol\CPP\build-${PRODUCT_NAME}-Desktop_Qt_$%QT_MAJOR_VERSION%_$%QT_MINOR_VERSION%_$%QT_REVISION%_$%QT_COMPILER%_32bit-Release\release\imageformats\qdds.dll"
  File /nonfatal "\Desenvol\CPP\build-${PRODUCT_NAME}-Desktop_Qt_$%QT_MAJOR_VERSION%_$%QT_MINOR_VERSION%_$%QT_REVISION%_$%QT_COMPILER%_32bit-Release\release\imageformats\qgif.dll"
  File /nonfatal "\Desenvol\CPP\build-${PRODUCT_NAME}-Desktop_Qt_$%QT_MAJOR_VERSION%_$%QT_MINOR_VERSION%_$%QT_REVISION%_$%QT_COMPILER%_32bit-Release\release\imageformats\qicns.dll"
  File /nonfatal "\Desenvol\CPP\build-${PRODUCT_NAME}-Desktop_Qt_$%QT_MAJOR_VERSION%_$%QT_MINOR_VERSION%_$%QT_REVISION%_$%QT_COMPILER%_32bit-Release\release\imageformats\qico.dll"
  File /nonfatal "\Desenvol\CPP\build-${PRODUCT_NAME}-Desktop_Qt_$%QT_MAJOR_VERSION%_$%QT_MINOR_VERSION%_$%QT_REVISION%_$%QT_COMPILER%_32bit-Release\release\imageformats\qjp2.dll"
  File /nonfatal "\Desenvol\CPP\build-${PRODUCT_NAME}-Desktop_Qt_$%QT_MAJOR_VERSION%_$%QT_MINOR_VERSION%_$%QT_REVISION%_$%QT_COMPILER%_32bit-Release\release\imageformats\qjpeg.dll"
  File /nonfatal "\Desenvol\CPP\build-${PRODUCT_NAME}-Desktop_Qt_$%QT_MAJOR_VERSION%_$%QT_MINOR_VERSION%_$%QT_REVISION%_$%QT_COMPILER%_32bit-Release\release\imageformats\qmng.dll"
  File /nonfatal "\Desenvol\CPP\build-${PRODUCT_NAME}-Desktop_Qt_$%QT_MAJOR_VERSION%_$%QT_MINOR_VERSION%_$%QT_REVISION%_$%QT_COMPILER%_32bit-Release\release\imageformats\qsvg.dll"
  File /nonfatal "\Desenvol\CPP\build-${PRODUCT_NAME}-Desktop_Qt_$%QT_MAJOR_VERSION%_$%QT_MINOR_VERSION%_$%QT_REVISION%_$%QT_COMPILER%_32bit-Release\release\imageformats\qtga.dll"
  File /nonfatal "\Desenvol\CPP\build-${PRODUCT_NAME}-Desktop_Qt_$%QT_MAJOR_VERSION%_$%QT_MINOR_VERSION%_$%QT_REVISION%_$%QT_COMPILER%_32bit-Release\release\imageformats\qtiff.dll"
  File /nonfatal "\Desenvol\CPP\build-${PRODUCT_NAME}-Desktop_Qt_$%QT_MAJOR_VERSION%_$%QT_MINOR_VERSION%_$%QT_REVISION%_$%QT_COMPILER%_32bit-Release\release\imageformats\qwbmp.dll"
  File /nonfatal "\Desenvol\CPP\build-${PRODUCT_NAME}-Desktop_Qt_$%QT_MAJOR_VERSION%_$%QT_MINOR_VERSION%_$%QT_REVISION%_$%QT_COMPILER%_32bit-Release\release\imageformats\qwebp.dll"

  SetOutPath "$INSTDIR\platforms"
  File /nonfatal "\Desenvol\CPP\build-${PRODUCT_NAME}-Desktop_Qt_$%QT_MAJOR_VERSION%_$%QT_MINOR_VERSION%_$%QT_REVISION%_$%QT_COMPILER%_32bit-Release\release\platforms\qwindows.dll"

  SetOutPath "$INSTDIR\printsupport"
  File /nonfatal "\Desenvol\CPP\build-${PRODUCT_NAME}-Desktop_Qt_$%QT_MAJOR_VERSION%_$%QT_MINOR_VERSION%_$%QT_REVISION%_$%QT_COMPILER%_32bit-Release\release\printsupport\windowsprintersupport.dll"

  SetOutPath "$INSTDIR\Databases"
  File /nonfatal "\Desenvol\CPP\${PRODUCT_NAME}\Databases\${PRODUCT_NAME}.db"

  SetOutPath "$INSTDIR\sqldrivers"
  File /nonfatal "\Desenvol\CPP\build-${PRODUCT_NAME}-Desktop_Qt_$%QT_MAJOR_VERSION%_$%QT_MINOR_VERSION%_$%QT_REVISION%_$%QT_COMPILER%_32bit-Release\release\sqldrivers\qsqlite.dll"
  File /nonfatal "\Desenvol\CPP\build-${PRODUCT_NAME}-Desktop_Qt_$%QT_MAJOR_VERSION%_$%QT_MINOR_VERSION%_$%QT_REVISION%_$%QT_COMPILER%_32bit-Release\release\sqldrivers\qsqlmysql.dll"
  File /nonfatal "\Desenvol\CPP\build-${PRODUCT_NAME}-Desktop_Qt_$%QT_MAJOR_VERSION%_$%QT_MINOR_VERSION%_$%QT_REVISION%_$%QT_COMPILER%_32bit-Release\release\sqldrivers\qsqlodbc.dll"
  File /nonfatal "\Desenvol\CPP\build-${PRODUCT_NAME}-Desktop_Qt_$%QT_MAJOR_VERSION%_$%QT_MINOR_VERSION%_$%QT_REVISION%_$%QT_COMPILER%_32bit-Release\release\sqldrivers\qsqlpsql.dll"

  SetOutPath "$INSTDIR\translations"
  File /nonfatal "\Desenvol\CPP\${PRODUCT_NAME}\*.qm"
  File /nonfatal "\Desenvol\CPP\build-${PRODUCT_NAME}-Desktop_Qt_$%QT_MAJOR_VERSION%_$%QT_MINOR_VERSION%_$%QT_REVISION%_$%QT_COMPILER%_32bit-Release\release\translations\qt_ca.qm"
  File /nonfatal "\Desenvol\CPP\build-${PRODUCT_NAME}-Desktop_Qt_$%QT_MAJOR_VERSION%_$%QT_MINOR_VERSION%_$%QT_REVISION%_$%QT_COMPILER%_32bit-Release\release\translations\qt_cs.qm"
  File /nonfatal "\Desenvol\CPP\build-${PRODUCT_NAME}-Desktop_Qt_$%QT_MAJOR_VERSION%_$%QT_MINOR_VERSION%_$%QT_REVISION%_$%QT_COMPILER%_32bit-Release\release\translations\qt_de.qm"
  File /nonfatal "\Desenvol\CPP\build-${PRODUCT_NAME}-Desktop_Qt_$%QT_MAJOR_VERSION%_$%QT_MINOR_VERSION%_$%QT_REVISION%_$%QT_COMPILER%_32bit-Release\release\translations\qt_en.qm"
  File /nonfatal "\Desenvol\CPP\build-${PRODUCT_NAME}-Desktop_Qt_$%QT_MAJOR_VERSION%_$%QT_MINOR_VERSION%_$%QT_REVISION%_$%QT_COMPILER%_32bit-Release\release\translations\qt_fi.qm"
  File /nonfatal "\Desenvol\CPP\build-${PRODUCT_NAME}-Desktop_Qt_$%QT_MAJOR_VERSION%_$%QT_MINOR_VERSION%_$%QT_REVISION%_$%QT_COMPILER%_32bit-Release\release\translations\qt_fr.qm"
  File /nonfatal "\Desenvol\CPP\build-${PRODUCT_NAME}-Desktop_Qt_$%QT_MAJOR_VERSION%_$%QT_MINOR_VERSION%_$%QT_REVISION%_$%QT_COMPILER%_32bit-Release\release\translations\qt_he.qm"
  File /nonfatal "\Desenvol\CPP\build-${PRODUCT_NAME}-Desktop_Qt_$%QT_MAJOR_VERSION%_$%QT_MINOR_VERSION%_$%QT_REVISION%_$%QT_COMPILER%_32bit-Release\release\translations\qt_hu.qm"
  File /nonfatal "\Desenvol\CPP\build-${PRODUCT_NAME}-Desktop_Qt_$%QT_MAJOR_VERSION%_$%QT_MINOR_VERSION%_$%QT_REVISION%_$%QT_COMPILER%_32bit-Release\release\translations\qt_it.qm"
  File /nonfatal "\Desenvol\CPP\build-${PRODUCT_NAME}-Desktop_Qt_$%QT_MAJOR_VERSION%_$%QT_MINOR_VERSION%_$%QT_REVISION%_$%QT_COMPILER%_32bit-Release\release\translations\qt_ja.qm"
  File /nonfatal "\Desenvol\CPP\build-${PRODUCT_NAME}-Desktop_Qt_$%QT_MAJOR_VERSION%_$%QT_MINOR_VERSION%_$%QT_REVISION%_$%QT_COMPILER%_32bit-Release\release\translations\qt_ko.qm"
  File /nonfatal "\Desenvol\CPP\build-${PRODUCT_NAME}-Desktop_Qt_$%QT_MAJOR_VERSION%_$%QT_MINOR_VERSION%_$%QT_REVISION%_$%QT_COMPILER%_32bit-Release\release\translations\qt_lv.qm"
  File /nonfatal "\Desenvol\CPP\build-${PRODUCT_NAME}-Desktop_Qt_$%QT_MAJOR_VERSION%_$%QT_MINOR_VERSION%_$%QT_REVISION%_$%QT_COMPILER%_32bit-Release\release\translations\qt_ru.qm"
  File /nonfatal "\Desenvol\CPP\build-${PRODUCT_NAME}-Desktop_Qt_$%QT_MAJOR_VERSION%_$%QT_MINOR_VERSION%_$%QT_REVISION%_$%QT_COMPILER%_32bit-Release\release\translations\qt_sk.qm"
  File /nonfatal "\Desenvol\CPP\build-${PRODUCT_NAME}-Desktop_Qt_$%QT_MAJOR_VERSION%_$%QT_MINOR_VERSION%_$%QT_REVISION%_$%QT_COMPILER%_32bit-Release\release\translations\qt_uk.qm"

gone:

SectionEnd

Section -AdditionalIcons
  SetOutPath $INSTDIR
  WriteIniStr "$INSTDIR\${PRODUCT_NAME}.url" "InternetShortcut" "URL" "${PRODUCT_WEB_SITE}"

  SetOutPath "$SMPROGRAMS\${PRODUCT_NAME}"
  CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Website.lnk" "$INSTDIR\${PRODUCT_NAME}.url"
  CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Uninstall.lnk" "$INSTDIR\uninst.exe"
  CreateShortcut "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME}.lnk" "$INSTDIR\${PRODUCT_NAME}.exe"

  CreateShortcut "$DESKTOP\${PRODUCT_NAME}.lnk" "$INSTDIR\${PRODUCT_NAME}.exe"

SectionEnd

Section -Post
  WriteUninstaller "$INSTDIR\uninst.exe"
  WriteRegStr HKLM "${PRODUCT_DIR_REGKEY}" "" "$INSTDIR\${PRODUCT_NAME}.exe"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninst.exe"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$INSTDIR\AppMainExe.exe"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}"
SectionEnd


Function un.onUninstSuccess
  HideWindow
  MessageBox MB_ICONINFORMATION|MB_OK "$(^Name) foi removido com sucesso do seu computador."
FunctionEnd

Function un.onInit
  MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "Tem certeza que quer remover completamente $(^Name) e todos os seus componentes?" IDYES +2
  Abort
FunctionEnd

Function .onInit
    System::Call 'kernel32::CreateMutex(p 0, i 0, t "myMutex") p .r1 ?e'
     Pop $R0

     StrCmp $R0 0 +3
       MessageBox MB_OK|MB_ICONEXCLAMATION "O instalador já está em execução."
       Abort
FunctionEnd

Section Uninstall
  Delete "$INSTDIR\${PRODUCT_NAME}.url"
  Delete "$INSTDIR\uninst.exe"
  Delete "$INSTDIR\translations\qt_uk.qm"
  Delete "$INSTDIR\translations\qt_sk.qm"
  Delete "$INSTDIR\translations\qt_ru.qm"
  Delete "$INSTDIR\translations\qt_lv.qm"
  Delete "$INSTDIR\translations\qt_ko.qm"
  Delete "$INSTDIR\translations\qt_ja.qm"
  Delete "$INSTDIR\translations\qt_it.qm"
  Delete "$INSTDIR\translations\qt_hu.qm"
  Delete "$INSTDIR\translations\qt_he.qm"
  Delete "$INSTDIR\translations\qt_fr.qm"
  Delete "$INSTDIR\translations\qt_fi.qm"
  Delete "$INSTDIR\translations\qt_en.qm"
  Delete "$INSTDIR\translations\qt_de.qm"
  Delete "$INSTDIR\translations\qt_cs.qm"
  Delete "$INSTDIR\translations\qt_ca.qm"
  Delete "$INSTDIR\sqldrivers\qsqlpsql.dll"
  Delete "$INSTDIR\sqldrivers\qsqlodbc.dll"
  Delete "$INSTDIR\sqldrivers\qsqlmysql.dll"
  Delete "$INSTDIR\sqldrivers\qsqlite.dll"
  Delete "$INSTDIR\Qt5Widgets.dll"
  Delete "$INSTDIR\Qt5Svg.dll"
  Delete "$INSTDIR\Qt5Sql.dll"
  Delete "$INSTDIR\Qt5PrintSupport.dll"
  Delete "$INSTDIR\Qt5Network.dll"
  Delete "$INSTDIR\Qt5Gui.dll"
  Delete "$INSTDIR\Qt5Core.dll"
  Delete "$INSTDIR\Qt5Qml.dll"
  Delete "$INSTDIR\Qt5Quick.dll"
  Delete "$INSTDIR\opengl32sw.dll"
  Delete "$INSTDIR\libGLESV2.dll"
  Delete "$INSTDIR\libEGL.dll"
  Delete "$INSTDIR\printsupport\windowsprintersupport.dll"
  Delete "$INSTDIR\platforms\qwindows.dll"
  Delete "$INSTDIR\imageformats\qwebp.dll"
  Delete "$INSTDIR\imageformats\qwbmp.dll"
  Delete "$INSTDIR\imageformats\qtiff.dll"
  Delete "$INSTDIR\imageformats\qtga.dll"
  Delete "$INSTDIR\imageformats\qsvg.dll"
  Delete "$INSTDIR\imageformats\qmng.dll"
  Delete "$INSTDIR\imageformats\qjpeg.dll"
  Delete "$INSTDIR\imageformats\qjp2.dll"
  Delete "$INSTDIR\imageformats\qico.dll"
  Delete "$INSTDIR\imageformats\qicns.dll"
  Delete "$INSTDIR\imageformats\qgif.dll"
  Delete "$INSTDIR\imageformats\qdds.dll"
  Delete "$INSTDIR\iconengines\qsvgicon.dll"
  Delete "$INSTDIR\Databases\SisMega.db"
  Delete "$INSTDIR\D3Dcompiler_43.dll"
  Delete "$INSTDIR\bearer\qnativewifibearer.dll"
  Delete "$INSTDIR\bearer\qgenericbearer.dll"

  Delete "$INSTDIR\*.ini"
  Delete "$INSTDIR\*.log"
  Delete "$INSTDIR\*.rwf"
  Delete "$INSTDIR\*.html*"
  Delete "$INSTDIR\*.map"
  Delete "$INSTDIR\*.tsk"
  Delete "$INSTDIR\${PRODUCT_NAME}.exe"

  Delete "$SMPROGRAMS\${PRODUCT_NAME}\Uninstall.lnk"
  Delete "$SMPROGRAMS\${PRODUCT_NAME}\Website.lnk"
  Delete "$DESKTOP\${PRODUCT_NAME}.lnk"
  Delete "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME}.lnk"

  RMDir "$SMPROGRAMS\${PRODUCT_NAME}"
  RMDir /r "$INSTDIR\translations"
  RMDir /r "$INSTDIR\sqldrivers"
  RMDir /r "$INSTDIR\printsupport"
  RMDir /r "$INSTDIR\platforms"
  RMDir /r "$INSTDIR\imageformats"
  RMDir /r "$INSTDIR\iconengines"
  RMDir /r "$INSTDIR\Databases"
  RMDir /r "$INSTDIR\bearer"
  RMDir /r "$INSTDIR\QtQml"
  RMDir /r "$INSTDIR\QtQuick"
  RMDir /r "$INSTDIR\QtQuick.2"
  RMDir "$INSTDIR"

  DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
  DeleteRegKey HKLM "${PRODUCT_DIR_REGKEY}"
  SetAutoClose true
SectionEnd

【讨论】:

  • 如果您能解释一下这个脚本的作用,那就太好了。
  • 好吧,这个脚本打包了所有必要的文件以与您的应用程序一起分发......它将所有需要的 Qt DLL 和 Win Redist 压缩成一个“安装程序”.exe 文件。我配置了一些环境变量(MSVC_FOLDER、MSVC_RUNTIME、QT_MAJOR_VERSION、QT_MINOR_VERSION、QT_REVISION 和 QT_COMPILER。)以使该脚本适用于我们在公司中使用的所有环境/Qt 版本(5.5.1、5.8.0 和 5.11)和编译器(Visual Studio 2010、2013 和 2015)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-21
相关资源
最近更新 更多