构建 DLL 时;我应该链接到什么类型的 CRT?

发布于 2024-10-21 03:50:54 字数 203 浏览 4 评论 0原文

在窗户中;有 2 个选项可以链接到 CRT:

  1. 多线程,静态链接
  2. 多线程,动态链接

有人可以阐明这里的最佳实践是什么吗?我应该“静态”链接到 CRT 还是进行动态链接?

如果我进行动态链接,并且编写一个使用我的 DLL + 另一个第 3 方 DLL(正在对 CRT 进行静态链接)的程序,这是否有问题?

In windows; there are 2 options to link to a CRT:

  1. Multithreaded, static link
  2. Multithreaded, dynamic link

Can someone shed some light on what is the best practice here? Should I link 'statically' to the CRT or do a dynamic link?

If i do a dynamic link, and I write a program that uses my DLL + another 3rd party DLL (which is doing a static link to CRT), is that an issue?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

旧情勿念 2024-10-28 03:50:54

当您在应用程序中使用 DLL 时,这是一件大事。 EXE 和 DLL 使用相同的内存分配器非常。如果您从需要由调用者释放的 DLL 函数返回指针或 C++ 对象(如 std::string)。要获得相同的分配器,所有模块必须使用相同的 CRT 实例。只有使用 /MD 进行编译以选择 CRT 的 DLL 版本时才能得到该信息。 并且它们必须全部使用相同版本的 CRT。无论如何,使用 /MT 都会导致很难诊断内存泄漏,如果幸运的话,会导致访问冲突。

使用 /MT 可以更轻松地部署应用程序,因为您不必安装运行时 DLL。正如所暗示的,只有当您只需部署 EXE 时,这才是安全的。或者当您非常仔细地控制 DLL 的公共接口时。例如,自动化兼容的 COM 服务器可以链接到 CRT 的静态版本。自动化对于交换指针和管理内存有严格的规则。

This is a Big Deal when you use DLLs in your application. It is very important that the EXE and the DLLs use the same memory allocator. In case you return pointers or C++ objects (like std::string) from a DLL function that needs to be released by the caller. To get the same allocator, all modules must use the same instance of the CRT. You only get that if you compile with /MD to select the DLL version of the CRT. And they must all use the same version of the CRT. Using /MT anyway causes very hard to diagnose memory leaks, an access violation if you're lucky.

Using /MT makes it easier to deploy your app since you don't have to install the runtime DLLs. As implied, this is only safe to do if you only have to deploy an EXE. Or when you very carefully control the public interface of your DLLs. An automation compatible COM server for example can link to the static version of the CRT. Automation has strict rules about exchanging pointers and managing memory.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文