首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我需要安装MSVC++ redist.?

为什么我需要安装MSVC++ redist.?
EN

Stack Overflow用户
提问于 2012-07-10 09:38:25
回答 2查看 459关注 0票数 5

我正在学习VC++,但我想知道为什么最终用户也需要MSVC++?

据我所知,在MSDN中,我的程序使用的大多数(如果不是全部)库(实际的DLL文件)已经随系统本身一起提供了(user32.dll、kernel32.dll等)。

但是为什么画图和记事本不需要MSVC++,而我的软件却需要这个运行时,它比记事本简单得多。运行库做什么?它怎麽工作?有没有办法让我的软件在没有MSVC++的情况下工作?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-10 09:44:17

运行时提供了所有标准函数和类,如std::stringstd::vector,以及运行全局对象的构造函数和析构函数、查找异常处理程序等的支持代码。Windows附带了所有这些功能的一个版本,Visual C++使用了它一段时间,但发现与标准不兼容,因此新版本的编译器附带了修复程序(Windows不能捆绑新的修复程序来取代旧的all,因为它会破坏现有的程序)。

是的,您可以避免需要运行时可再发行安装程序。您可以使用/MT构建选项,该选项将所有必需的库函数直接绑定到您的可执行文件中。在此之后,您将只需要Windows附带的DLL。

该设置位于项目配置中的C/C++ ->代码生成->运行时库下

但请注意,这会使您的可执行文件稍微大一些,并且任何bug修复(特别是通过Windows Update分发的安全修复)都不会影响您的程序,因为您已经内置了特定的实现。

票数 8
EN

Stack Overflow用户

发布于 2012-07-10 09:55:07

补充一下Ben的答案:

运行时为每个Visual Studio版本捆绑了许多功能。使用DLL版本的运行库的主要优点是,每当系统更新有问题的DLL时,您都可以“免费”获得(安全)更新。

有些人会指出的另一个优点是,如果许多进程通过DLL使用运行库,则使用DLL版本可以节省资源。这是因为Windows具有跨进程(或进程的主要部分)共享内存中的DLL的机制。

您会注意到,将运行时捆绑到您的二进制文件中-也称为静态链接-将使您的二进制文件变得更大,因为您的每个二进制文件现在都带有自己的运行时版本(如果不重新链接程序,则无法替换)。

还要注意混合(您自己的) DLL,这些DLL静态地链接到运行时的不同版本(即Debug与Release),或者根据DLL动态和静态地链接到运行时。这里的问题是分配器。要分配的函数(malloccallocnew)和空闲内存在这些函数之间是不兼容的。在这种情况下,最好的方法是使用独立的机制,如IMalloc -或者始终在对象实例中携带释放分配器,确保对free/delete的调用不会跨越模块边界,即使实例是在另一个模块中处理的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11405506

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档