VS开发中的静态编译

针对现象:

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

2、 程序启动即发生异常,或者没反应。(具体现象跟系统设置有关)

3、 客户端发布必须连带msvcr80.dll,mfc80.dll等dll和manifest文件才能正常运行


问题定位:

出现上述现象之后可以确定是缺少程序运行所需的环境,可以通过安装相应的vcredist_x86.exe来验证。针对vs版本,分别有

32位的(X86),也有64位的(X64),请注意区别下载。

★ Microsoft Visual C++ 2005 Redistributable Package下载地址:

(x86):http://www.microsoft.com/downloads/details.aspx?familyid=32BC1BEE-A3F9-4C13-9C99-220B62A191EE&displaylang=zh-cn

(x64):http://www.microsoft.com/downloads/details.aspx?familyid=90548130-4468-4BBC-9673-D6ACABD5D13B&displaylang=zh-cn

★ Microsoft Visual C++ 2008 Redistributable Package的下载地址:

(x86):http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=5582

★ Microsoft Visual C++ 2010 Redistributable Package

(x86):http://www.microsoft.com/download/en/details.aspx?id=5555?

(x64):http://www.microsoft.com/download/en/details.aspx?id=14632?

如果安装完之后可以正常运行程序,可以继续往下看,如果还不行,请考虑其它原因。


解决办法:

如果可以接受,让用户自行下载VC运行库也是一种办法。

其次,可以把程序所需的dll一并发布。

如果不想带很多文件一起发布,可以使用静态链接发布程序。

 

静态链接MFC和ATL库的方法

Alt+F7打开Project Property,展开:

  Configuration Properties

  General

  Use of MFC

  Use of ATL

然后改成Static Library即可.如果已经是“在静态库中使用 MFC”了,生成之后在目标机器还是会有现象1的提示,那么很有可能就是没有静态链接C/C++运行库,msvcr是C运行库,msvcp是C++运行库。如果你使用了STL之类C++的东西,msvcp就是必须的。(修改方法如下)


静态链接MSVCR和MSVCP的办法

Alt+F7打开Project Property,展开:

  Configuration Properties

  C/C++

  Code Generation

  Runtime Library

然后将选项由/MD改为 "Multi-threaded (/MT)"


再如果……按照上面操作完成之后程序依然有问题,请考虑:程序有没有静态连接其它的lib,而这些lib是不是也是同样静态连接的C/C++运行库,如果连接的lib还依赖和其它的lib,那么被依赖的lib是不是同样静态链接了C/C++运行库


举例说明:

一个利用libtorrent库开发的下载测试程序(以下简称为例子)为win32项目,没有使用mfc,在纯净版系统上运行需要msvcr和msvcp的支持。例子编译依赖libtorrent.lib,而libtorrent.lib又深度依赖boost库,确保例子静态编译,不再依赖msvcr和msvcp的支持就必须在编译libtorrent.lib和boost库的时候明确静态链接c,c++运行库。经过实际测试,例子程序已经实现单独在纯净系统上的运行。

 

参考资料:

http://wylht.blogspot.com/2012_03_01_archive.html

http://gamebabyrocksun.blog.163.com/blog/static/57153463201081101856593/

http://www.cnblogs.com/dementia/archive/2009/04/10/1433217.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值