为什么我需要非托管代码上的可再发行包?(msvcp100.dll) “msvcrXXX.dll”和“msvcpXXX.dll”的用途是什么?msvcr和msvcp之间有什么区别 如果二进制文件只是一个非常简单且非托管的.dll,为什么需要将它们链接到二进制文件?是因为它是链接器的一部分吗?为什么默认情况下它不作为公共库存在于Windows系统目录中

为什么我需要非托管代码上的可再发行包?(msvcp100.dll) “msvcrXXX.dll”和“msvcpXXX.dll”的用途是什么?msvcr和msvcp之间有什么区别 如果二进制文件只是一个非常简单且非托管的.dll,为什么需要将它们链接到二进制文件?是因为它是链接器的一部分吗?为什么默认情况下它不作为公共库存在于Windows系统目录中,c,dependencies,runtime,unmanaged,redistributable,C,Dependencies,Runtime,Unmanaged,Redistributable,我只是想理解为什么在Windows中会有如此复杂的东西……msvcrXXXX.dll是C运行时库的dll。 MSVCPXXX.DLL是C++运行库的DLL。 如果您使用MD /ORD或MDD建立这些依赖关系,则这些依赖项中的一个或两个将被添加到二进制文件中,这是VisualStudio在创建新C++项目时指定的默认值。使用这些标志之一表示您希望程序链接到C/C++运行时的DLL版本。您可以在项目属性->配置属性->C/C++/代码生成/运行库下更改默认值 如果您将项目更改为使用/MT或/MTd,

我只是想理解为什么在Windows中会有如此复杂的东西……

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

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

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

通常,对于具有多个模块(DLL)的应用程序,使用/MD和/MDd标志更有效,因为所有这些模块都将在应用程序进程中共享C/C++运行库及其关联数据结构的一个副本

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