我正在学习VC ++,但我想知道为什么最终用户也需要MSVC ++?
据我所知,在MSDN中,我的程序使用的大多数库(实际的DLL文件)已经附带了系统本身(user32.dll,kernel32.dll等)。
但是Paint和Notepad怎么不需要MSVC ++,但我的软件比Notepad更简单需要这个运行时?运行时有什么作用?它是如何工作的?有没有办法让我的软件在没有MSVC ++的情况下工作?
答案 0 :(得分:8)
运行时提供所有标准函数和类,如std::string
和std::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。这里的问题是分配器。分配(malloc
,calloc
,new
)和空闲内存的功能在这些功能之间是不兼容的。在这种情况下,最好的方法是使用独立的机制,例如IMalloc
- 或者始终在对象实例中携带解除分配器,确保对free
/ delete
的调用不会跨模块边界,即使实例是在另一个模块中处理的。