最近发现了一个非常恼人的程序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. HTML-Canvas01

    画直线: var c = document.getElementById("myCanvas"); //不要忘写document var ctx = c.getContext(&q ...

  2. ZOJ2930 The Worst Schedule(最小割)

    题目大概说有n个任务,每个任务可以提前或推迟,提前或推迟各有一定的费用,有的任务一旦推迟另一个任务也必须推迟,问怎么安排任务使花费最少,且最少花费的条件下提前的任务数最多能多少. 问题就是要把各个任务 ...

  3. LightOJ1033 Generating Palindromes(区间DP/LCS)

    题目要计算一个字符串最少添加几个字符使其成为回文串. 一年多前,我LCS这道经典DP例题看得还一知半解时遇到一样的问题,http://acm.fafu.edu.cn/problem.php?id=10 ...

  4. POJ2125 Destroying The Graph(二分图最小点权覆盖集)

    最小点权覆盖就是,对于有点权的有向图,选出权值和最少的点的集合覆盖所有的边. 解二分图最小点权覆盖集可以用最小割: vs-X-Y-vt这样连边,vs和X部点的连边容量为X部点的权值,Y部和vt连边容量 ...

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

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

  6. 去掉 wap (android/ios)网页等点击后的阴影

    tap后会出现一个半透明的灰色背景,(被批...),起初以为是outline作怪,加上后发现没反应,最后发现是tap后的背景高亮,要重设这个表现,则需要设置-webkit-tap-highlight- ...

  7. 生成跨语言的类型声明和接口绑定的工具(Djinni )

    Djinni 是一个用来生成跨语言的类型声明和接口绑定的工具,主要用于 C++ 和 Java 以及 Objective-C 间的互通. 示例接口定义文件: # Multi-line comments ...

  8. memcached与spring

    key的生成规则 update 与 query 的参数不一样,如何让其生成一样的key 列表缓存如何定义key及失效 最近同事推荐了一个开源项目:Simple-Spring-Memcached(简称s ...

  9. SDUT 2610 Boring Counting(离散化+主席树区间内的区间求和)

    Boring Counting Time Limit: 3000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Descriptio ...

  10. Setting property 'source' to 'org.eclipse.jst.jee.server

    警告: [SetPropertiesRule] Setting property 'source' to 'org.eclipse.jst.jee.server:project' did not fi ...