【问题标题】:LoadLibrary MSVCRT IssueLoadLibrary MSVCRT 问题
【发布时间】:2012-08-08 04:57:36
【问题描述】:
有两个问题让我很困惑:
我从微软网站上了解到,我们不能在同一个项目中使用不同的 C 运行时。假设我有一个用 /MT 标志编译的 dll,那么我不能在 /MD 编译的项目中使用该 dll。我的问题是,如果我使用 LoadLibrary() 来加载 dll,我是否也需要拥有相同的 C 运行时?如果我不这样做有什么潜在危险?
我认为使用 /MT 标志,运行时静态链接到二进制文件中。但是对于我的一个 dll 项目,我使用 /MT 制作了一个 dll。但是,当我转储bin.exe /dependents mydll 时,它显示MSVCR100.dll 是一个依赖项。我的问题是为什么dll仍然依赖于MSVCR100.dll?
【问题讨论】:
标签:
dll
loadlibrary
msvcrt
【解决方案1】:
1) 不,这不是要求。这发生在任何程序中,例如 Windows DLL 使用它们自己的 CRT。然而,在一个程序中混合 CRT 是非常危险的,并且可能导致非常难以诊断问题。 Windows apis 是为避免这些问题而精心设计的,它们从不需要代码来释放在 DLL 中分配的内存,不使用异常,不使用标准 C++ 库类,不依赖于语言环境或任何其他类型共享 CRT 状态。混合时会出错的那种事情。限制自己使用 C 或 COM api 有助于避免这些陷阱。
2) 当您链接使用 /MD 编译的代码时会发生这种情况。与您链接的 .lib 相同。
当您的项目中有 DLL 并使用完全相同的编译器和选项编译所有代码时,始终使用 /MD 可以避免麻烦。非自己构建的静态库很麻烦,避免使用。
【解决方案2】:
关于你的 2. 问题,依赖是间接的。您的 DLL 使用依赖于 MSVCR100.dll 的 DLL。使用Dependency walker可以看到你的组件的依赖树,看看哪个库直接和间接依赖。