最近发现了一个非常恼人的程序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. Google地图接口API之地图控件集(五)

    1.默认控件集 当使用一个标准的google地图,它的控件默认设置如下: (1). Zoom-显示一个滑动条来控制map的Zoom级别,如下所示:

  2. 模拟 POJ 1573 Robot Motion

    题目地址:http://poj.org/problem?id=1573 /* 题意:给定地图和起始位置,robot(上下左右)一步一步去走,问走出地图的步数 如果是死循环,输出走进死循环之前的步数和死 ...

  3. 一只小蜜蜂...[HDU2044]

    一只小蜜蜂... Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

  4. CodeForces Round 193 Div2

    I know,this is another failure.It seems like that failure is a habit with me.This time I solved two ...

  5. Designing CSS Layouts With Flexbox Is As Easy As Pie

    This article is an updated excerpt of the chapter “Restyle, Recode, Reimagine With CSS3″ from our Sm ...

  6. Codeforces Round #208 (Div. 2) A.Dima and Continuous Line

    #include <iostream> #include <algorithm> #include <vector> using namespace std; in ...

  7. TYVJ P1030 乳草的入侵 Label:跳马问题

    背景 USACO OCT09 6TH 描述 Farmer John一直努力让他的草地充满鲜美多汁的而又健康的牧草.可惜天不从人愿,他在植物大战人类中败下阵来.邪恶的乳草已经在他的农场的西北部份佔领了一 ...

  8. 用java删除文件夹里的所有文件

    import java.io.File; public class Test { public static void main(String args[]){ Test t = new Test() ...

  9. ITK 3.20.1 VS2010 Configuration 配置

    Download ITK 3.20.1 Download VS2010 Download CMake 3.2.0 I assume you've already installed VS2010 an ...

  10. Git Shell使用笔记

    1,首次打开Git shell错误(以前打开过gethub客户端) 警告: git command could not be found. Please create an alias or add ...