5

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

据我在 MSDN 中看到的,我的程序使用的大多数库(实际的 DLL 文件)已经随系统本身提供(user32.dll、kernel32.dll 等)。

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

4

2 回答 2

8

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

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

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

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

于 2012-07-10T01:44:17.173 回答
2

添加到本的答案:

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

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

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

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

于 2012-07-10T01:55:07.340 回答