`
qimo601
  • 浏览: 3446458 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

【转】如何打包发布基于Qt4 Windows的软件

    博客分类:
  • Qt
阅读更多

转载:http://qt.csdn.net/articles.aspx?pointid=490&pointid2=

先从Windows平台开始。 Windows平台下的软件发布最主要的需求是想办法找到在你的发布中应该包含哪些必须的文件, 同时要保证应用程序运行时能正确找到这些文件, 发布基于Qt的软件也是同样的需求。 就不同的情况一一阐述:

静态链接的情况

静态链接是最简单的情况,这种情况下需要发布的文件数量是最少的, 只需要发布一个单独的执行档外加编译器相关的dll文件。 这种情况下Qt库首先要静态编译:

< [other -static>

nmake sub-src

//如果用mingw编译,nmake替换成mingw32-make
//sub-src指只编译src目录,这样省去编译examples等目录的时间

注意哦,如果你在同一个build目录用不同的configure选项去编译Qt,  必须在重新configure之前运行nmake distclean清除以前生成的目标和中间文件, 保证一个干净的编译环境,不然有可能会出一些奇怪的链接错误哦~~

编译好Qt静态库下一步再编译应用程序:
cd application_dir
nmake clean
qmake -config release
nmake

编译成功之后应该得到一个可以独立执行的exe文件, 可以将程序拷贝到其他没有安装qt的机器上测试。 需要注意的是这个程序不一定百分之百可以运行,因为编译器带的库仍然是动态编译的,如果你的目标机里没有这些库的话仍然会有运行时的问题。 后面会讲到如何用工具来检查应用程序的依赖。

静态链接方法比较重要的缺陷是无法支持插件, 而且插件不能编译进程序中,所以插件提供的功能就丢失了。 这样一来要想用到插件的功能还是要用下面的方法。

动态链接的情况

动态链接程序的发布需要解决两个问题, Qt库需要与应用一起发布, 另外插件也要一起打包,并保证放在适当的位置, 这样应用程序才能找到它。
动态编译应用的基础是先将Qt库动态编译(默认参数即是动态编译),这样用普通的程序编译流程就可生成动态编译的执行档,使用的命令与上面相同。 我们可以用一个Qt的例子测试前面说的发布方法, 在Qt包里带的例子Plug & Paint
是个非常合适的测试例子,它既包含应用又自带插件文件, 可以很好的验证发布是否正确。 该例子在examples/tools/plugandpaint下。 这个例子如果编译成功, 得到一个plugandpaint.exe和pnp_basictools.dll、pnp_extrafilters.dll两个插件文件。

程序打包

第一步,将应用程序和Qt库拷贝到同一目录。(Windows下库的搜索先从当前目录开始,然后是在系统PATH环境变量指定的路径查找。)
第二步,检查应用程序还依赖哪些dll,如编译器带的dll或其他系统dll。 参见应用程序的依赖关系一节。
第三步,验证程序可以在目标系统上正确运行, 将目前包里的文件拷贝到目标系统上,尝试运行程序。
第四步,发布插件程序。 插件和普通的动态库的发布不同, 不能简单的将之拷贝到应用目录里。 应用程序在运行时会在其对应的plugins目录下去查找插件。 针对这个例子,发布包应该类似这样的结构:

模块

文件名

执行档 plugandpaint.exe
Basic Tool插件 plugins\pnp_basictools.dll
ExtraFilters插件 plugins\pnp_extrafilters.dll
Qt Core模块 qtcore4.dll
Qt Gui模块 qtgui4.dll

除了程序和Qt库,还有下面的编译器库:

VC++ 6.0

VC++ 7.1 (2003)

VC++ 8.0 (2005)

C运行库 msvcrt.dll msvcr71.dll msvcr80.dll
C++运行库 msvcp60.dll msvcp71.dll msvcp80.dll

插件的位置除了Qt默认的路径还可以通过代码里调用Qt的API来指定, 相应的API是QApplication::addLibraryPath()或QApplication::addLibraryPaths(). 如:

qApp->addLibraryPath(”c:\some\path”);

上述代码的推荐调用位置是在main函数中,QApplication构造完毕之后。 应用程序会在搜索默认路径之后去搜索你指定的库路径。

Visual Studio 2005

vs2005编译的程序在发布的时候还需要考虑一些额外的情况,比较麻烦点。 要把manifest文件拷贝到应用程序的目录, 这个文件包含应用的依赖信息, 在运行时需要用到。 另外,如果你的动态库的依赖和应用不同,那么还需要把manifest文件内嵌到dll文件中。 Qt4.1.3之后的版本提供了CONFIG选项来提供内嵌manifest文件的功能, embed_manifest_dll和embed_manifest_exe, 用法是将下面的选项加入pro文件, 如下:

CONFIG+=embed_manifest_exe

默认情况下embed_manifest_dll已经开启。 关于manifest文件的更多信息参考MSDN的相关文章

有两种发布vc运行库的方法, 一个是安装vs的运行库到目标系统中, 另外是将库打包到应用程序的目录。 打包vs运行库很简单,就是把 <Visual Studio Install Path>\VC\redist\<Architecture>\Microsoft.VC80.CRT拷贝到应用程序目录,与应用程序一起打包。 如果你在打包运行库的同时还要发布插件程序,要注意把manifest文件从插件中去掉,不然在一些系统上会导致插件无法加载。 去掉manifest的方法是在插件的pro文件中加入下面的选项:

CONFIG-=embed_manifest_dll

VS系统的运行包可以免费获得, 只需要将这个安装包和你的应用安装包一起发布,并且在安装你的程序的时候去运行这个安装包就行了。 比如32位的x86系统, 安装32bit-x86-vs运行时包。 其他平台对应的包可以在微软网站找到。

应用程序的依赖关系

额外的依赖库

这里我们的秘密武器终于隆重登场了! 那就是 Dependency Walker工具。 看一张截图:

deployment-windows-depends

用这个工具检查上面的例子, 发现下面的库不是系统自带的:

Qt

VC++ 6.0

VC++ 7.1 (2003)

VC++ 8.0 (2005)

MinGW

QTCORE4.DLL

 

QTGUI4.DLL

MSVCRT.DLL

 

MSVCP60.DLL

MSVCR71.DLL

 

MSVCP71.DLL

MSVCR80.DLL

 

MSVCP80.DLL

MINGWM10.DLL(如果用mingw来编译的话需要这个库)

别忘了也检查一下plugin库的依赖。

Qt自带的插件

很多情况下,我们的程序还依赖Qt带的一些插件,比如图像格式的支持或数据库驱动支持等。 这些插件需要放在plugins的特定子目录下, 如图像格式插件在plugins\imageformat下. Qt搜索插件的默认路径是QTDIR\plugins, 这个路径已经写入了Qt库中, 但我们可以通过以下几种方法来override这个路径。

  1. 编辑qt.conf文件,推荐的方法(后面将写一篇关于qt.conf的帖子)
  2. 用前面提到的QApplication::addLibraryPath函数
  3. 使用第三方的工具修改QtCore库里写入的路径
分享到:
评论

相关推荐

    基于QT4的桌面常用软件小助手

    这个“基于QT4的桌面常用软件小助手”是针对初学者设计的一个学习项目,旨在帮助开发者理解如何利用QT4进行桌面应用程序的开发。在QT4中,我们可以利用丰富的库函数和强大的图形用户界面(GUI)工具来创建功能丰富的...

    Qt程序打包工具

    Qt程序打包工具是用于将基于Qt框架开发的应用程序打包成可独立运行的可执行文件的工具。这样的工具简化了分发和安装过程,使得用户无需在目标计算机上安装完整的Qt库就能运行应用程序。本文将深入探讨Qt程序打包的...

    基于QT的网速测试界面

    9. **打包与发布**: 最终的软件可以通过QT的qmake和make工具构建,也可以使用jom或ninja加速编译。对于不同平台,如Windows的.exe或Linux的.AppImage,可以使用QT的部署工具处理依赖,生成可分发的可执行文件。 ...

    QT打包软件windeployqt和enigmavb.7z

    总的来说,"QT打包软件windeployqt和enigmavb.7z"压缩包提供了一套完整的解决方案,帮助开发者轻松地打包和分发基于QT的Windows应用程序,确保它们在目标机器上能够顺利运行,而不需要额外安装QT环境或依赖库。...

    基于QT的贪吃蛇程序

    本项目是基于QT框架实现的一个经典游戏——贪吃蛇,让我们来深入探讨一下其中涉及的知识点。 1. **QT框架**:QT的核心是Qt库,它提供了丰富的API用于图形用户界面(GUI)的创建,网络通信,数据库访问等。QT支持...

    QT5.9.1 Windows 环境搭建

    在Windows环境下构建基于QT的应用程序通常需要进行一系列环境配置工作。本文将详细介绍如何完成QT5.9.1的安装与配置,以及如何利用外部库(以zlib为例)和打包工具(windeployqt及Enigma Virtual Box)来简化应用...

    基于Qt/Embedded的GUI应用程序的实现

    由于许多基于Qt的X Windows程序可以方便地移植到Qt/Embedded版本上,使得Qt/Embedded成为众多嵌入式项目的首选。Qtopia是由TrollTech公司基于Qt/Embedded开发的第一个嵌入式窗口环境和应用程序集合,广泛应用于PDA、...

    Qt程序打包配置

    对于基于QtQuick的应用程序,其打包流程与QtWidgetsApplication类似,但也有一些额外的注意事项: 1. **创建QtQuickApplication项目** 使用Qt Creator创建一个名为“helloqml”的新QtQuickApplication项目。 2. ...

    基于QT的精美日历

    总结来说,“基于QT的精美日历”项目涉及到QT框架的深入运用,包括自定义控件、日历功能扩展、界面美化、事件处理、多语言支持以及性能优化等多个方面。通过这样的项目实践,开发者不仅可以提升QT编程技能,还能增强...

    基于QT的音乐播放器

    在"基于QT的音乐播放器"项目中,开发者利用QT库构建了一个音乐播放软件。尽管该播放器存在一些问题,如无法随意切换歌曲,但这个项目仍然是一个良好的学习和实践QT编程的实例。以下将详细介绍QT框架中的关键概念以及...

    qt打包工具

    当开发完基于Qt的程序后,为了让用户能够在没有安装Qt环境的计算机上运行,我们需要使用特定的打包工具来处理这个问题。 Qt的打包工具有多种,如windeployqt、macdeployqt、linuxdeployqt等,这些工具是Qt Creator...

    QT Release版 打包

    通过以上步骤,你已经成功地将Qt Release版本的应用程序打包,使其成为一个独立的可执行文件集合,可以在任何安装了相应系统库的Windows机器上运行。请注意,对于不同的Qt版本和编译器,以及不同的操作系统,打包...

    基于Qt的提醒工具qt-notify-master.zip

    描述中的"基于Qt的提醒工具qt-notify-master.zip"与标题相同,进一步强调了这个项目是利用Qt库构建的提醒功能软件。可能包括定时提醒、消息显示、声音提示等功能,适用于各种操作系统,如Windows、Linux、macOS等。 ...

    基于Qt Creator平台的简单计算器

    总结起来,"基于Qt Creator平台的简单计算器"项目涵盖了Qt库的使用、C++编程基础、GUI设计、事件处理、逻辑编程、错误处理、调试和应用打包等多个知识点。通过这个项目,初学者可以逐步熟悉Qt开发环境,掌握开发GUI...

    从开发到发布:Qt与OpenCV项目的打包与跨平台部署.pdf

    《从开发到发布:Qt与OpenCV项目的打包与跨平台部署.pdf》是一本针对开发者和软件工程师的实用指南,旨在帮助读者掌握如何将基于Qt和OpenCV的应用程序进行打包和跨平台部署。随着计算机视觉和图像处理应用的日益普及...

    Qt 应用程序 发布工具

    Qt应用程序发布工具是一种基于Qt Installer Framework的解决方案,用于简化和优化Qt开发的软件的分发过程。这个工具允许开发者将应用程序及其所有相关依赖项整合到一个可执行的安装包中,便于用户在不同平台上轻松...

    Qt嵌入式编程实现

    标题《Qt嵌入式编程实现》所涉及的知识点涵盖了Qt的原理、安装和...最后,课程内容还包括了Qt的发展历程、Qt的应用程序开发方法、以及如何打包和发布Qt应用程序。这些知识点对于完整的理解Qt的应用开发周期至关重要。

    Qt-unified-windows-x86-3.2.3-online.rar

    6. **打包发布**:完成开发后,可以使用Qt的部署工具将应用程序打包为独立的可执行文件,方便分发。 总的来说,"Qt-unified-windows-x86-3.2.3-online.rar"提供了在Windows 32位平台上搭建Qt开发环境的便捷途径。...

    基于Qt开发的文件保险柜工具(文件加解密).zip

    【标题】: "基于Qt开发的文件保险柜工具(文件加解密)" 【描述】: "这是一个使用C++编程语言,并基于Qt框架开发的文件保险柜应用。它旨在为用户提供安全的文件存储和加密服务,确保用户数据的隐私和安全性。通过此...

    Qt商品信息管理系统

    本项目“Qt商品信息管理系统”就是基于Qt框架开发的一款应用,旨在帮助用户高效地管理和处理商品信息。 **Qt框架的核心特点** 1. **跨平台性**:Qt支持Windows、macOS、Linux、Android、iOS等多个操作系统,使得...

Global site tag (gtag.js) - Google Analytics