- “msvcr XXX .dll”和“msvcp XXX .dll”的用途是什么?msvc r和 msvc p之间有什么区别?
- 如果它只是一个非常简单且不受管理的 .dll,为什么我需要将它们链接到我的二进制文件?是因为它是链接器的一部分吗?为什么默认不在Windows系统目录下作为通用库?
我只是想了解为什么在 Windows 中有这么复杂的东西....
我只是想了解为什么在 Windows 中有这么复杂的东西....
msvcrXXXX.dll 是 C 运行时库的 DLL。msvcpXXXX.dll 是 C++ 运行时库的 DLL。
如果您使用 /MD 或 /MDd 构建,这些依赖项中的一个或两个将添加到您的二进制文件中,这是 Visual Studio 在创建新 C++ 项目时指定的默认值。使用这些标志中的任何一个表示您希望您的程序与 C/C++ 运行时的 DLL 版本链接。您可以在 Project Properties->Configuration Properties->C/C++/Code Generation/Runtime Library 下更改默认值。
如果您将项目更改为使用 /MT 或 /MTd,那么您的应用程序将不会生成对上述任何一个 DLL 的引用,因为 C/C++ 运行时将直接链接到您的程序中。对于大多数简单的程序,这不会导致任何问题。但是,如果您的程序被分解成几个 DLL,所有这些 DLL 都是使用这些标志构建的,那么每个 DLL 都将保留一份引用的 CRT 函数和静态数据的副本,您可能会遇到内存分配/释放问题。为了避免这些,您需要确保在给定 DLL 中分配的对象也在同一个模块中被释放。
通常,对具有多个模块 (DLL) 的应用程序使用 /MD 和 /MDd 标志会更有效,因为所有这些模块都将共享 C/C++ 运行时库及其关联数据结构的一个副本。申请流程。
但是,对于简单的单模块应用程序,请随意使用 /MT 或 /MTd 构建。