Visual studio 为什么我需要安装MSVC++;redist。?

Visual studio 为什么我需要安装MSVC++;redist。?,visual-studio,winapi,visual-c++,msvcrt,Visual Studio,Winapi,Visual C++,Msvcrt,我正在学习VC++的过程中,但我想知道为什么最终用户也需要MSVC++ 就我在MSDN中所见,我的程序使用的大多数库(如果不是所有库的话)(实际的DLL文件)都已经与系统本身(user32.DLL、kernel32.DLL等)一起提供了 但是为什么画图和记事本不需要MSVC++,而是我的软件,它比记事本更简单,需要这个运行时?运行时做什么?它是如何工作的?有没有办法让我的软件在没有MSVC++的情况下工作?运行时提供了所有标准函数和类,如std::string和std::vector,以及运行全

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

就我在MSDN中所见,我的程序使用的大多数库(如果不是所有库的话)(实际的DLL文件)都已经与系统本身(user32.DLL、kernel32.DLL等)一起提供了


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

运行时提供了所有标准函数和类,如
std::string
std::vector
,以及运行全局对象的构造函数和析构函数、查找异常处理程序等的支持代码。Windows附带了所有这些的版本,有一段时间VisualC++使用它,但是发现它与标准不兼容,因此编译器的更新版本需要修复(Windows不能捆绑新的修复来代替旧的DLL,因为它会破坏现有程序)。 是的,您可以避免使用运行时可再发行安装程序。您可以使用
/MT
构建选项,该选项将所有必需的库函数绑定到可执行文件中。之后,您只需要Windows附带的DLL

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


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

Ben的答案补充道:

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

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

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


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

Notepad和Paint实际上使用MSVC运行时DLL。但它是Microsoft作为Windows安装的一部分部署的,并且特定于Windows程序c:\Windows\system32\msvcrt.dll。使用/MD编译时,您需要部署自己的版本,该版本特定于您使用的VS版本。还要注意,
msvcrt.dll
在Windows版本之间不兼容。虽然WDK可用于链接
msvcrt.dll
(即VS6运行时),但较新的目标将使用较旧版本的
msvcrt.dll
中没有的函数,例如在XP上。因此,即使这个DLL从XP开始被提升为“系统DLL”,它也有它的警告。