VC 软件发布的故事(1)

当我们兴冲冲把自己写的小程序传给朋友,亦或是正式发布产品到用户手中,时常会遇到“由于应用程序的配置不正确,应用程序未能启动,重新安装应用程序可能会纠正这个问题”。

这么个提示实在是让人有点气馁啊,那么怎么解决呢,是什么导致这个问题呢?

(注意,本文不涉及msvc7.x,因为这个版本的两个主要产品我接触很少)

 

首先,静态链接所有库是不会遇到这个问题的,但不是所有情况下我们都能静态链接所有库,特别是存在MFC扩展dll的时候,以及使用了没有static lib的第三方库的时候(这些库可能要求动态链接msvcrt)。

 

msvc6时代没这个问题,因为程序不能运行会提示缺少xxx.dll,这样很容易解决,只需要把必要的dll和软件一起发布就可以了(这个需要注意dll作者的再发布许可协议)。

msvc8,msvc9引入了所谓的程序集概念(注意不是.net那个意义的程序集,但是借助于这个概念)使用winsxs来避免dll hell,但是(嗯,大家都怕这个但是)却引入了另一个问题:版本匹配。

假设下列场景:

1 我们编译环境是msvc8或者msvc9,并且始终安装最新的补丁

2 发布给用户编译出来的binary和msvc8/msvc8sp1/msvc9/msvc9sp1 redist

3 运行失败

这实在是令人倍感挫折,为什么不行了呢?问题的根源在menifest,如果我们打开binary随带的menifest,并且检查相关dll的版本号,会发现版本号远高于msvc redist里面的,这将导致系统拒绝加载dll,表面现象就是

“由于应用程序的配置不正确,应用程序未能启动,重新安装应用程序可能会纠正这个问题”。

结论:编译环境的补丁会将编译环境的头文件升级,导致默认配置编译出来的binary需求更高级的版本号。

解决办法:

msvc8:定义 _USE_RTM_VERSION 宏,这将强制编译出使用msvc8 rtm版本号的bingary。

msvc9:取消定义 _BIND_TO_CURRENT_VCLIBS_VERSION 宏,这将编译出使用msvc9 rtm版本号的bingary。

这样,使用标准的msvc8/msvc8sp1/msvc9/msvc9sp1 redist即可。

msvc10微软取消了之前的设计,回归了msvc6的做法,于是正确的发布应该是下面这样

静态链接:这个兼容问题最少,但是无法享受系统补丁带来的安全和改进。

动态链接:可以依赖系统目录下的msvcrt dll,这样系统打补丁就会自动享受系统更新带来的改进。也可以把msvcrt和自己的binary放在一起,这样便享受不到系统更新。

补充说明:有极少数用户报告即便拷贝msvcrt100.dll之类的文件到系统目录或者binary目录,也无法运行,我无法重现,不知道具体原因。

时间: 2024-11-05 14:57:28

VC 软件发布的故事(1)的相关文章

Microsoft Visual Studio 开发的C++程序软件发布相关事宜

VS2005/VS2008软件发布: Debug版本: 非MFC程序: 编译选项mdd: 仅依赖C++库和C运行时库,需要到VS2005/VS2008下安装目录VC/redist/Debug_NonRedist中,找到Microsoft.VC90.DebugCRT目录,其中的清单文件*.manifest中内容对应依赖库文件msvcp90d.dll和msvcr90d.dll:前者为C++库,后者为C运行时库:此外还有一个msvcm90d.dll库,项目中一般也会用到:对于清单文件,若VS配置属性中

qt 软件发布在别的机器不能运行(IDE为vs2005)

1.添加项目用到的库文件 打开vs解决方案,找到你的项目,右键->属性,就会看到如下图所示 (2). 在qt的bin目录下找到对应的dll文件 注意带有d表示debug版的.比如QtSqld4.lib这里d就是debug版的意思,发布用的是release版的,所以要找对应的release版,就是没有d的版本. 同时还要加上windows的库文件. debug C:\Program Files\Microsoft Visual Studio 8\VC\redist\Debug_NonRedist\

AlphaDict 软件发布

短短续续,经过了大约大半年的开发, 我的第一个软件作品:AlphaDict 终于 release 了1.0, 这是一段很困难的时间,需要从写文档开始,做所有的事情.为了保持代码的简洁, 可控,减少对系统平台的依赖性.我尽量使用 标准 c/c++ 库的 API, 不得不自己去封装打包一些东西. 有时候,碰到一些平时没有深入的问题,不得不中断手头的工作,来深入学习新的东西, UTF-8/16/32, UNICODE, UCS 为了深入理解这些,不得不停下来,去看UNICODE的spec,  C++模

【转】appStore上传苹果应用程序软件发布流程

转载地址:http://blog.sina.com.cn/s/blog_68661bd801019uzd.html 首先确定帐号是否能发布, https://developer.apple.com/account,如果你打开Provisioning Portal,然后点击DisTribution看到的是下图中那样,再考虑按下面的方法弄 (1)图中加号是灰色,点击图中的加号,没有反应,说明你的帐号不能发布,找你们老大要帐号,正常情况是加号是黑色,点击会弹出一个创建证书界面. (2) 没有发布证书,

软件发布版本命名规则

1 版本类型 1.1 正式版本 Enhance:增强版或者加强版 属于正式版Full version:完全版 属于正式版Release:发行版,有时间限制Upgrade:升级版Retail:零售版Plus:增强版,不过这种大部分是在程序界面及多媒体功能上增强. 1.2 测试版本 Alphal:内部测试版Beta:外部测试版M 版: Milestone,意思是每个开发阶段的终结点的里程碑版本Trail:试用版(含有某些限制,如时间.功能,注册后也有可能变为正式版)RC版:Release Candi

虚拟机应该在软件发布时完成作用

类似 java 通过虚拟机编译代码的语言,应该实现在发布时就转化成本地机器代码,这样就可以实现两种好处:1,用户端不需要安装虚拟机运行环境:2,保持本地代码的高效运行能力.虚拟机在软件运行时仍然需要运作的唯一理由是保证与不同机器之间的兼容性,这并不是一个好理由,更好的选择应该是确定性,从现在的问题来看,是提早代码的确定性,不是在运行时确定,而是在发布时确定.类似c++从来不需要任何中间编译的机制来保证自己的运行无误,andorid的软件就更有理由实现这一点.因此,虚拟机不应该运行在软件运行的时候

appStore上传苹果应用程序软件发布流程(之前都是同事发,复制一份备用)

首先确定帐号是否能发布, https://developer.apple.com/account,如果你打开Provisioning Portal,然后点击DisTribution看到的是下图中那样,再考虑按下面的方法弄 (1)图中加号是灰色,点击图中的加号,没有反应,说明你的帐号不能发布,找你们老大要帐号,正常情况是加号是黑色,点击会弹出一个创建证书界面. (2) 没有发布证书,如果有,是图中那样,如果你没有或者状态不对,则你需要新建证书,下面的内容会一步步介绍.(3)发布还需要用到Xcode

从C++起步到MFC实战VC++软件工程师高端培训视频教程

本课程从C++起步.用户无需任何计算机基础,只需要懂的基本的电脑操作,既可学习本课程,本课程适合在校大学生,在职人员等,通过本课程的学习,学员可掌握C++\MFC\VC++服务器端.网络编程等技能 有兴趣的可以加我个人QQ:779591710 第一阶段:C++入门超基础精讲(28课时)主要内容:本部分是您成为VC++软件工程师必备的阶段,如果您没有任何基础,学习C++能快速让您进入编程领域,建议配合书籍<C++入门经典> 第1讲:程序设计语言原理及C++入门(6课时)第2讲:基本数据类型扩展数

VC++软件工程师高端教程

从C++起步到MFC实战VC++软件工程师高端培训(服务器端开发方向) http://www.dwz.cn/u3wMp 咨询QQ2110053820 课程讲师:Gamebaby 课程分类:品牌套餐 适合人群:初级 课时数量:350课时 更新程度:完毕 用到技术:TCPIP协议.HTTP和FTP协议 涉及项目:LSP项目.LSPSetup项目 课程简介 本课程从C++起步.用户无需任何计算机基础,只需要懂的基本的电脑操作,既可学习本课程, 本课程适合在校大学生,在职人员等,通过本课程的学习,学员可