为什么我需要安装MSVC ++ redist。

时间:2012-07-10 01:38:25

标签: visual-studio winapi visual-c++ msvcrt

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

据我所知,在MSDN中,我的程序使用的大多数库(实际的DLL文件)已经附带了系统本身(user32.dll,kernel32.dll等)。

但是Paint和Notepad怎么不需要MSVC ++,但我的软件比Notepad更简单需要这个运行时?运行时有什么作用?它是如何工作的?有没有办法让我的软件在没有MSVC ++的情况下工作?

2 个答案:

答案 0 :(得分:8)

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

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

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

但请注意,这会使您的可执行文件变得更大,并且任何错误修复(尤其是通过Windows Update分发的安全修复程序)都不会影响您的程序,因为您已经完成了特定的实现。

答案 1 :(得分:2)

添加Ben的回答:

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

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

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

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