为什么我需要非托管代码的可再发行组件包?(msvcp100.dll)

lqb*_*web 16 c redistributable dependencies unmanaged runtime

  1. 'msvcr XXX .dll'和'msvcp XXX .dll' 的目的是什么?msvc r和msvc p之间有什么区别?
  2. 如果它只是一个非常简单且非托管的.dll,为什么我需要将它们链接到我的二进制文件?是因为它是链接器的一部分吗?为什么默认情况下它不在Windows系统目录中作为公共库?

我只是想了解为什么在Windows中有些事情如此复杂......

Bre*_*ell 35

msvcrXXXX.dll是C运行时库的DLL.msvcpXXXX.dll是C++运行时库的DLL.

如果使用/ MD或/ MDd构建,则会将这些依赖项中的一个或两个添加到二进制文件中,这是Visual Studio在创建新C++项目时指定的默认值.使用这些标志之一表示您希望程序与C/C++运行时的DLL版本链接.您可以在"项目属性" - >"配置属性" - >"C/C++ /代码生成/运行时库"下更改默认值.

如果您将项目更改为使用/ MT或/ MTd,那么您的应用程序将不会生成对上面列出的任何DLL的引用,因为C/C++运行时将直接链接到您的程序中.对于大多数简单程序,这不会导致任何问题.但是,如果您的程序被分解为几个使用这些标志构建的DLL,那么每个DLL将维护引用的CRT函数和静态数据的副本,并且您可能会遇到内存分配/释放问题.要避免这些,您需要确保在给定DLL中分配的对象也在同一模块中释放.

通常,对具有多个模块(DLL)的应用程序使用/ MD和/ MDd标志更有效,因为所有这些模块将共享C/C++运行时库的单个副本及其相关的数据结构.申请流程.

但是,对于简单的单模块应用程序,可以随意使用/ MT或/ MTd构建.

  • 很好的解释. (2认同)