最近发现了一个非常恼人的程序deployment的问题,估计大家有可能也会遇到,特此memo。

问题的出现我觉得主要还是微软搞的花头太多, 一个不知所谓的manifest文件让本来简单的程序发布变得困难重重。 找了找关于manifest的介绍,貌似这个文件是用来描述程序或者库的依赖关系, 特别是对程序依赖的版本进行描述, 这样系统可以通过manifest的内容找到正确的库版本。 理论上讲这个dd确实是不错, 可以解决版本不兼容的问题, 保证程序运行的时候用的是指定版本的库。 不过实际操作起来麻烦事一箩筐。
笔者对vs/windows编程十分之菜,可能理解的有所偏差, 欢迎指正。 大概也是从vs2005以上的版本开始程序编译时对这个manifest要求更严格了? 要么可以将manifest信息内嵌到程序里,要么就在发布程序的时候带上这个manifest文件才能保证程序找到依赖的外部库。 Qt相对这种情况也在build system内部做了相应的调整, 目前的状况是默认把manifest内嵌在binary里, 包括库、程序和插件。

按照Qt文档的说法, 发布基于vs2005以上版本的Qt程序有两种方法, 一是把vc的crt目录Microsoft.VC80.CRT拷贝到程序路径下与程序一起发布; 另外一个是在目标机器上安装vc的redistribution package。 实际上经过笔者的实验, 第一种方法行不通, 常见的症状是按照文档做了程序不能启动,或者是插件无法载入。 找了个专家咨询了一下,发现问题就出在内嵌的manifest信息上。 由于Qt库内嵌了manifest信息, 程序运行的时候系统只会到固定的位置寻找vc的库,根本就不搜索本地的路径。 笔者的试验结果是即使把vc的库放在与程序exe相同的目录下都找不到,真是奇怪哉! vs2005的程序还没遇到过这样的情况哦!

专家给出的意见是要么安装vc的redistribution package, 这个是肯定能行的。 还有一种方法是在编译Qt时在pro里加 CONFIG-=embed_manifest_dll (这一点和文档上说的似乎是相反的,可见Qt的文档有谬误。), 编译的插件也需要在pro里加 CONFIG-=embed_manifest_plugin, 包括我们的程序pro里要加 CONFIG-=embed_manifest_exe, 这样才圆满了! 这种做法的原理是程序里不嵌入库的版本和路径信息, 系统就会按照传统的方式搜索匹配的库,也就会搜索到程序所在的路径或者是文档里提到的Microsoft.VC80.CRT路径等等。

各位看官谁家有vs2005以上的版本并遇到了类似问题可以试验一下, 成功与否来冒个泡。 笔者这里没有vs2008可测试,不过想想觉得这个方案还是比较靠谱的。

http://www.cnblogs.com/bingcaihuang/archive/2011/03/15/1984836.html

基于vs2005以上版本Qt程序发布的注意事项(讲了manifest的问题)的更多相关文章

  1. qt 程序发布

    Qt 程序发布步骤: 注意5.5 以后不再支持 WinXP 1) dll 抽取工具 windeployqt.exe 2) Windows脚本 实例: D:\Qt\Qt5.5.0\5.5\mingw49 ...

  2. Qt 程序发布以及打包成exe安装包

    一.简述 Qt 项目开发完成之后,需要打包发布程序,而因为用户电脑上没有 Qt 配置环境,所以需要将 release 生成的 exe 文件和所依赖的 dll 文件复制到一个文件夹中,然后再用 Inno ...

  3. 解决Qt程序发布时中文乱码问题(通过QApplication.addLibraryPath加载QTextCodec插件)

    Qt程序的文字编码,是通过插件来解决的,所以我们发布的时候需要把相应的插件也发布出去,在开发者电脑上程序会自动从插件目录加载到插件,但是如果发布给别的电脑使用,需要手动指定插件路径,如下所示: int ...

  4. Mac中QT程序发布

    基于Qt开发的应用程序进驻Mac App Store 最近摸索着将一个基于用Qt开发的App发布到Mac App Store,在网上查找相关资料的时候,发现很多文档都过期了,要有一些修改,所以想记录下 ...

  5. VS编译的QT程序发布时产生的AppCrash问题

    至少我碰到了三个情况,都是AppCrash错误(以下都指VS2008的Release的设置) 第1个错误,报错模块是程序自己 我使用VS2008 Team with SP1和QT4.86编译程序,一直 ...

  6. VS2012以后版本MFC程序发布记录,支持XP

    ##概述 自从VS2012之后,增加了新的VC运行时库,而一般用户机器上不一定有对应的版本的运行时库,所以微软官方给出的方案是需要用户安装对应版本的VisualC++Redistributable P ...

  7. qt 程序发布打包

    1. 首先把 release 版本的 exe 复制到其他文件夹,比如 Desktop\test 2. 使用开始菜单中 qt 里面的控制台窗口,使用 cd 命令打开到 Desktop\test 位置,然 ...

  8. QT程序发布

    1.新建一个脚本文件,后缀为.bat 2.查看自己qt的windeployqt.exe路径,一般在QT安装的bin目录,而且脚本程序中需要去掉其后缀, 前面部分是windeployqt.exe的路径以 ...

  9. Windows 下QT程序发布

    方法1:利用QT自带打包工具 1.新建文件夹,把编译好的exe文件放入该文件夹 2.使用QT下的命令行 3.进入该exe所在文件,执行windeployqt xxx.exe,若出现找不到命令的情况 4 ...

随机推荐

  1. js:语言精髓笔记10--闭包

    闭包:  //JS函数式风格中,在内部保存数据和对外无副作用这两个特性主要就是通过闭包实现的: 函数与闭包: 一个函数是一段静态代码,它是一个代码书写时已经编译期,静态概念:闭包是函数在代码运行过程中 ...

  2. 枚举 POJ 1753 Flip Game

    题目地址:http://poj.org/problem?id=1753 /* 这题几乎和POJ 2965一样,DFS函数都不用修改 只要修改一下change规则... 注意:是否初始已经ok了要先判断 ...

  3. UIBarButtonItem不能获取frame

    在使用KxMenu这个厉害的控件做竖直列表的时候,发现UIBarButtonItem不能获取到frame,UIBarButtonItem是NSObject的子类,他不是一个uiresponed或者ui ...

  4. BZOJ3276 : 磁力

    按距离建立线段树,维护区间重量最小值 然后跑一遍拓扑,每次将所有能取的加入队尾 #include<cstdio> #include<algorithm> #define N 2 ...

  5. BZOJ3830 : [Poi2014]Freight

    首先为了保证发车时间都不同,T[i]=max(T[i],T[i-1]+1) 然后设f[i]表示前i列车回来的最早时刻 f[i]=min(max(T[i],f[j]+i-j-1)+s*2+i-j-1) ...

  6. HDU 4405 期望DP

    期望DP算是第一题吧...虽然巨水但把思路理理清楚总是好的.. 题意:在一个1×n的格子上掷色子,从0点出发,掷了多少前进几步,同时有些格点直接相连,即若a,b相连,当落到a点时直接飞向b点.求走到n ...

  7. js中等性操作符(==)、关系操作符(<,>)和布尔操作符(!)比较规则

    最近一直在笔试面试,经常碰到例如 123=='123'.'abc'==true等问题,其中有答对的,也有答错的,主要原因还是对ECMAScript的规范没有理解清楚,很多题目没有具体分析所导致.现查阅 ...

  8. How to Programmatically Switch between the HubTile Visual States

    In this post I am going to talk about how to programmatically switch between different HubTile Visua ...

  9. Codeforces Round #203 (Div. 2) A.TL

    #include <iostream> #include <algorithm> using namespace std; int main(){ int n,m; cin & ...

  10. 【Vijos】1218 数字游戏

    题目链接:https://vijos.org/p/1218 算法:环形DP+划分型DP 环形DP的思路很简单,将1~n中每一个节点当成起点进行划分型DP即可,关于划分型DP前面论文有介绍~查找tag把 ...