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

时间:2011-11-21 18:22:56

标签: c dependencies runtime unmanaged redistributable

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

1 个答案:

答案 0 :(得分:33)

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进行构建。