环境:QT5.4.1(msvc2013_64_opengl),Win7 64bit

编译方式

  Qt开发的程序发布的时候经常采用两种方式:1)静态编译,可生成单一的可执行文件;2)动态编译,需同时附上需要的dll文件。

静态编译

  静态编译,是指把相关的库也一并引入exe文件,这样程序的尺寸就会很大,不过程序发布就会变得简单很多。

动态编译(Qt默认)

  动态编译,是指相关的库,以dll动态链接库的形式引用。动态编译的exe程序比较小,因为相关的库都没有包含进来。所以程序发布的时候要把相关的库也一并发布出去。

  一般使用动态编译动态链接Qt库,尤其代码规模比较大,需要多人协作开发时,不同模块按dll划分比较方便,采用静态链接是不现实的。

Debug版本

  Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。

Release 版本

  Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的。一般来说,release版的可执行程序体积要比debug版小很多,而且由于剥离了许多调试信息及符号等,运行效率相对也高一些,因此一般采用release编译。

打包发布

  本文采用Qt动态编译,release版本的程序。需要将相应的dll跟Qt可执行程序exe文件放在一个目录下。如下例所示:

  所需的dll文件包括:

  1、C Runtime库msvcrt,使用VC编译的C或C++程序,都需要相关的C runtime库才能运行,如该例程中的msvcp120.dll,msvcr120.dll等;

  2、icudt53.dll、icuin53.dll、icuuc53.dll、Qt5Widgets.dll、Qt5Core.dll、Qt5Gui.dll等 (Qt 的bin目录中)动态引用的Qt库;

  3、platforms、imageformats、audio等运行时加载的dll 文件夹;

  4、程序中引用的第三方库,如QWT,openCV,第三方库的dll文件如qwt.dll、opencv_world300.dll。

将exe文件在另一台电脑上运行时,若缺少运行所必需的dll文件,会报错——缺少dll文件。

C Runtime库

  问题比较多的是VC的运行时库 msvcrt。使用VC编译的C或C++程序,都需要相关的C runtime库才能运行。本文采用的是VS2013编译器,对应的就是MSVCR120。进入Microsoft.VC120.CRT 目录:${VS Install Dir}\VC\redist\x64\Microsoft.VC120.CRT,就能找到C runtime库(msvcp120.dll,msvcr120.dll,vccorlib120.dll)。

  从vc2005开始微软加入了manifest机制控制运行时库的加载,如果用户机器上未安装过msvcrt的distribution pack,程序就不能运行。简单的处理方法是把C runtime库一并包含进去,即将Microsoft.VC120.CRT 目录下的文件(msvcp120.dll,msvcr120.dll,vccorlib120.dll)放到exe相同的目录即可。应用程序如果找不到系统安装的msvcrt,就会加载自带的库文件。

Qt库

  编译Qt后,将Qt生成路径(..\build-untitled-Desktop_Qt_5_4_1_MSVC2013_OpenGL_64bit-Release\release)中的exe程序放到新建的package中,Qt程序中使用到的(在.pro文件中添加的)QtCore,QtGUI,xml,sql,multimedia等相关的动态库和调用它的exe一起放在同一个目录中。

  Qt的图片解码库比如jpeg、gif解码等是以插件形式存在的,要包含imageformats文件夹中的dll文件,还有windows平台相关的platforms,windows中的语音相关的audio等文件夹中包含的dll文件。

  对于采用动态编译的Qt可执行程序,如果不确定该程序使用了哪些必要的dll,可以使用工具查看该Qt可执行程序使用了哪些dll。

工具

  1、 查找程序运行依赖的dll文件

  最简单的方式是用Qt自带的生成必备dll文件的windepolyqt工具:

  windepolyqt  xxx.exe

  如果将Qt的bin目录加入PATH环境,就可以直接在命令行使用windeployqt调用。将生成的xxx.exe可执行文件复制到一个空的文件夹里,进入这个文件夹 ,运行windeployqt xxx.exe,则该执行文件需要的大部分依赖文件都自动拷贝到这个文件夹里了。

  如果还使用了其他的第三方的SDK,如QWT,OpenCV等,就需要手动将所需dll拷贝过来,如果不知道还需要哪些dll文件,可以用Dependency Walker (depends.exe)和 微软的 procexp.exe 来查看程序运行时还缺少哪些dll。

  2、 一个Qt的安装包制作工具,用户打包程序,变成(桌面)安装包,如开源工具Inno Setup(http://www.jrsoftware.org/isinfo.php)进行打包。

  这样之后,就得到了一个在其它没有安装Qt和VS的电脑上也可以运行的Qt程序安装包了。

Qt软件打包发布(QT5.4.1(msvc2013_64_opengl),Win7 64bit)的更多相关文章

  1. Qt 程序打包发布总结

    1.  概述 当我们用QT写好了一个软件,要把你的程序分享出去的时候,不可能把编译的目录拷贝给别人去运行.编译好的程序应该是一个主程序,加一些资源文件,再加一些动态链接库,高大上一些的还可以做一个安装 ...

  2. Qt开发北斗定位系统融合百度地图API及Qt程序打包发布

    Qt开发北斗定位系统融合百度地图API及Qt程序打包发布 1.上位机介绍 最近有个接了一个小型项目,内容很简单,就是解析北斗GPS的串口数据然后输出经纬度,但接过来觉得太简单,就发挥了主观能动性,增加 ...

  3. Qt程序打包发布方法(使用官方提供的windeployqt工具)

    Qt程序打包发布方法(使用官方提供的windeployqt工具) 转自:http://tieba.baidu.com/p/3730103947?qq-pf-to=pcqq.group Qt 官方开发环 ...

  4. 在QT C++中调用 Python并将软件打包发布(裸机可运行)

    为了提高工作效率,需要一个可以自动生成多份相关联的word文档免去繁琐复制粘贴工作的软件.最后选定使用QT C++做界面和主要逻辑程序设计,对word的操作使用python写好对应的函数,然后在QT中 ...

  5. Qt之打包发布(NSIS详解)

    来源:http://blog.sina.com.cn/s/blog_a6fb6cc90101fer8.html 发布方式    Qt发布的时候,通常使用两种方式:   (1)静态编译  (2)动态编译 ...

  6. QT程序打包发布

    本来感觉这是一个简单的操作,今天看见群里有人在问这个问题,他说网上查了很多都不成功,突然就想把自己初学的时候记录一下! 题目谢了QT程序的打包发布,那就是两步骤:打包+发布! 注释:这篇博文用的是Qt ...

  7. qt 软件打包

    今天呈现的客户端完成了要打包发布,想了一下还不会,就问了一下度娘,在此记录一下学习的程度 1>将QT编译工具的BUG模式切换成Release模式,在Release模式下生成一个*.exe的可执行 ...

  8. Qt 程序打包发布

    Qt 官方开发环境使用的动态链接库方式,在发布生成的exe程序时,需要复制一大堆 dll,Qt 官方开发环境里自带了一个工具:windeployqt.exe.在Qt安装目录如:C:\Qt\Qt5.7. ...

  9. Qt 程序打包发布总结 转

    1.  概述 当我们用QT写好了一个软件,要把你的程序分享出去的时候,不可能把编译的目录拷贝给别人去运行.编译好的程序应该是一个主程序,加一些资源文件,再加一些动态链接库,高大上一些的还可以做一个安装 ...

随机推荐

  1. Rotting Oranges - LeetCode

    目录 题目链接 注意点 解法 小结 题目链接 Rotting Oranges - LeetCode 注意点 解法 解法一:bfs.首先先统计所有新鲜的橘子数目fresh,如果fresh大于0则一直执行 ...

  2. Linux下cp ~中关于“~”的疑问

    目的:将wi主文件夹下的.bashrc复制到/tmp,并更名为bashrc.对于书上的代码上加“~”存在疑问. cp ~/.bashrc /tmp/bashrc 对命令进行了以下尝试: 为什么不加“~ ...

  3. 【bzoj3238】 Ahoi2013—差异

    http://www.lydsy.com/JudgeOnline/problem.php?id=3238 (题目链接) 题意 给出一个字符串,求${\sum_{1<=i<j<=n} ...

  4. hibernate的懒加载

    WHY? WHAT? HOW? 所谓懒加载(lazy)就是延时加载,延迟加载.即不是不加载,而是在需要的时候才加载. 什么时候用懒加载呢,我只能回答要用懒加载的时候就用懒加载. 至于为什么要用懒加载呢 ...

  5. WHY C++ ?(by Herb Sutter) & C++17 standard

    WHY C++ ? C++

  6. 交互式shell脚本对话框----whiptail指令

    当你在linux环境下setup软件的时候就会有相应的对话框让你输入.虽然我们已经习惯了这种交互的方法,但是如果有一种直观的界面来输入是不是会更加友好和方便呢,在shell脚本中你可以使用-whipt ...

  7. shell参数代表什么,如何调试shell?

    $0就是该bash文件名$?是上一指令的返回值$*所有位置参数的内容:就是调用调用本bash shell的参数.$@基本上与上面相同.只不过是“$*”返回的是一个字符串,字符串中存在多外空格.“$@” ...

  8. matlab绘制实用日历实例代码

    function TheStudy;%函数名 close all;%关闭所有床头 DD={'Sun','Mon','Tue','Wed','Thu','Fri','Sat'};%日历表头文字 figu ...

  9. Linux下安装Python3和django并配置mysql作为django默认服务器

    我的操作系统为centos6.5 1  首先选择django要使用什么数据库.django1.10默认数据库为sqlite3,本人想使用mysql数据库,但为了测试方便顺便要安装一下sqlite开发包 ...

  10. Kubernetes 1.5 配置dns

    在kubernetes1.2的时候,采用了skydns + kube2dns +etcd的方式来部署dns.而从1.3开始,则部署方式有了一点儿变化,将skydns和kube2dns封装到了一个容器镜 ...