我正在学习 VC++,但我想知道为什么最终用户也需要 MSVC++?
据我在 MSDN 中看到的,我的程序使用的大多数库(实际的 DLL 文件)已经随系统本身提供(user32.dll、kernel32.dll 等)。
但是为什么画图和记事本不需要 MSVC++,但是我的软件,比记事本简单得多,需要这个运行时?运行时做什么?它是如何工作的?有没有办法让我的软件在没有 MSVC++ 的情况下工作?
我正在学习 VC++,但我想知道为什么最终用户也需要 MSVC++?
据我在 MSDN 中看到的,我的程序使用的大多数库(实际的 DLL 文件)已经随系统本身提供(user32.dll、kernel32.dll 等)。
但是为什么画图和记事本不需要 MSVC++,但是我的软件,比记事本简单得多,需要这个运行时?运行时做什么?它是如何工作的?有没有办法让我的软件在没有 MSVC++ 的情况下工作?
运行时提供所有标准函数和类,例如std::string
and std::vector
,以及运行全局对象的构造函数和析构函数、查找异常处理程序等的支持代码。Windows 提供了所有这些的版本,并且有一段时间使用 Visual C++它,但发现与标准不兼容,因此较新版本的编译器带有修复程序(Windows 不能捆绑新修复程序来代替旧的 DLL,因为它会破坏现有程序)。
是的,您可以避免使用运行时可再发行安装程序。您可以使用/MT
build 选项,它将所有必需的库函数直接捆绑到您的可执行文件中。之后,您将只需要 Windows 附带的 DLL。
该设置位于 C/C++ -> 代码生成 -> 运行时库下的项目配置中
但请注意,这会使您的可执行文件稍大一些,并且任何错误修复(尤其是通过 Windows 更新分发的安全修复)都不会影响您的程序,因为您有一个特定的实现。
添加到本的答案:
运行时为每个各自版本的 Visual Studio 捆绑了许多功能。使用运行时的 DLL 版本的主要优点是,只要系统更新有问题的 DLL,您就可以“免费”获得(安全)更新。
有人会指出的另一个优点是,如果许多进程通过 DLL 使用运行时,它可以节省使用 DLL 版本的资源。这是因为 Windows 有一种机制可以跨进程(或其中的主要部分)共享内存中的 DLL。
您会注意到将运行时捆绑到您的二进制文件中(也称为静态链接)将使您的二进制文件更大,因为您的每个二进制文件现在都带有自己的运行时版本(如果不重新链接程序就无法替换)。
还要注意混合(您自己的)DLL,这些 DLL 静态链接到运行时的不同版本(即调试与发布),或者根据 DLL 动态和静态链接到运行时。这里的问题是分配器。分配 ( malloc
, calloc
, new
) 和释放内存的函数在这些函数中是不兼容的。在这种情况下,最好的方法是使用独立的机制,例如IMalloc
- 或始终在对象实例中携带释放器,确保对free
/的调用delete
不会跨越模块边界,即使实例在另一个模块中处理。