gpt4 book ai didi

c - 为什么我需要非托管代码上的可再分发包? (msvcp100.dll)

转载 作者:太空狗 更新时间:2023-10-29 16:31:43 25 4
gpt4 key购买 nike

  1. “msvcrXXX.dll”和“msvcpXXX.dll”的用途是什么? msvcr 和 msvcp 有什么区别?
  2. 如果它只是一个非常简单且不受管理的 .dll,为什么我需要将它们链接到我的二进制文件?是因为它是链接器的一部分吗?为什么它不作为普通库默认在Windows系统目录下?

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

最佳答案

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

如果您使用/MD 或/MDd 进行构建,这些依赖项中的一个或两个将被添加到您的二进制文件中,这是在您创建新的 C++ 项目时 Visual Studio 指定的默认值。使用这些标志之一表示您希望您的程序链接到 C/C++ 运行时的 DLL 版本。您可以在 Project Properties->Configuration Properties->C/C++/Code Generation/Runtime Library 下更改默认值。

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

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

不过,对于简单的单模块应用程序,请随意使用/MT 或/MTd 进行构建。

关于c - 为什么我需要非托管代码上的可再分发包? (msvcp100.dll),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8216558/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com