我只是想了解为什么在Windows中有些事情如此复杂......
答案 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进行构建。