1

有两个问题让我很困惑:

  1. 我从微软网站上读到,我们不能在同一个项目中使用不同的 C 运行时。假设我有一个用 /MT 标志编译的 dll,那么我不能在 /MD 编译的项目中使用该 dll。我的问题是,如果我使用 LoadLibrary() 加载 dll,我是否也需要拥有相同的 C 运行时?如果我不这样做有什么潜在的危险?

  2. 我认为使用 /MT 标志,运行时静态链接到二进制文件中。但是对于我的一个 dll 项目,我用 /MT 制作了一个 dll。但是,当我转储bin.exe /dependents mydll 时,它显示MSVCR100.dll 是一个依赖项。我的问题是为什么dll仍然依赖于MSVCR100.dll?

4

2 回答 2

2

1) 不,这不是要求。这发生在任何程序中,例如 Windows DLL 使用它们自己的 CRT。然而,在一个程序中混合 CRT 是非常危险的,并且可能导致非常难以诊断问题。Windows api 经过精心设计以避免这些问题,它们从不需要代码来释放在 DLL 中分配的内存,不使用异常,不使用标准 C++ 库类,不依赖于语言环境或任何其他类型共享 CRT 状态。混合时会出错的那种事情。限制自己使用 C 或 COM api 有助于避免这些陷阱。

2) 当您链接使用 /MD 编译的代码时,会发生这种情况。与您链接的 .libs 常见。

当您的项目中有 DLL 并使用完全相同的编译器和选项编译所有代码时,始终使用 /MD 可以避免麻烦。不是你自己构建的静态库很麻烦,避免使用。

于 2012-08-08T09:43:50.290 回答
1

关于你的 2. 问题,依赖是间接的。您的 DLL 使用依赖于 MSVCR100.dll 的 DLL。使用Dependency walker,您可以查看组件的依赖关系树,并查看直接和间接依赖的库。

于 2012-08-08T08:50:18.317 回答