2

我需要在我的应用程序中使用一些针对 msvcrt.dll 编译的 DLL。我已经尝试过了,一切似乎都很好。我的第一个担心是对 msvcrt.dll 的额外依赖;我已经包含了 Visual Studio 10 运行时库,并希望不必添加更多。我知道 msvcrt.dll 总是在窗口系统文件夹中,但我应该依赖这个吗?

这是有关库的页面:

http://www.zlatkovic.com/libxml.en.html

我可以下载源代码并从头开始编译,并且可以长期这样做,但现在我想确保链接这些库和使用 DLL 不会出现问题。

该页面上有一段内容如下:

“您使用这些二进制文件编译的每个程序都必须使用相同的运行时。除非您喜欢您的应用程序崩溃,否则请将您的项目设置为使用 msvcrt.dll。如果您出于某种原因必须使用不同的运行时,那么您必须获取源代码并进行编译libxml 和你自己的朋友。”

这就是我担心的。目前看起来一切都很好,但我担心当它在其他具有不同设置的系统上出现时会发生什么..

4

2 回答 2

3

我知道 msvcrt.dll 总是在窗口系统文件夹中,但我应该依赖这个吗?

是的。msvcrt.dll由 Windows 拥有和维护。您可以依赖它的存在,并且您不需要(也不应该)自己分发它。

将 dll 链接到不同的运行时版本是没有问题的,只要它们不跨 DLL 边界传递 CRT 定义的类型(std::vector例如,它们可能具有不同的实现,因此从链接的 dll 传递这样的对象msvcr100.dll 到与 msvcrt.dll 链接的 dll 可能会导致问题,只要您不在一个 dll 中分配内存,并在另一个 dll 中释放它(同样,它们可能有不同的malloc/free实现,并且可能使用不同的堆)

但是它们可以很好地共存,只要你不要求它们做任何“不合理”的事情,这需要它们知道另一个dll 链接的 CRT 版本。(而且我相信几乎每个程序最终都依赖于 msvcrt.dll,因为如果不出意外,它们会链接到各种 Windows DLL,而这些 DLL 又会链接到 msvcrt.dll。所以如果这种情况不安全,那么几乎每个为 Windows 编写的程序都是不安全的)

于 2013-03-09T14:02:24.767 回答
0

通常在您创建或使用的 DLL 中,它们将取决于 msvcrt 的编号版本,例如:msvcrt90.dll 或调试版本:msvcrt90d.dll。或者也许是 msvcrt100.dll/msvcrt100d.dll。这些 DLL 包含所谓的 C 运行时库的实现。也许你把这个 msvcrt.dll 和我上面提到的那些混淆了?他们是两个不同的东西。

据我所知,msvcrt.dll 是微软自己的操作系统内部版本。您完全不必担心、思考、挠头、扭动眉毛或为该 DLL 失眠。

在“混合”C 运行时库中唯一需要注意的一件事就是不要从一个版本的 CRT 分配内存,而是使用不同版本的 CRT 释放它。最终,这涉及从一个堆分配并释放另一个堆。这很糟糕,CRT 会抱怨并抛出异常。

如果您部署的应用程序依赖于任何特定版本的 CRT,您还可以部署安装 CRT 的安装程序。微软实际上为这些提供免费下载。例如,如果您在启动应用程序时编译您的应用程序时依赖于超旧版本的 CRT(例如不再随 windows 提供的版本),那么唯一会发生的事情是 windows 将拒绝启动您的应用程序。它会给你一个神秘的信息,你必须谷歌才能弄清楚。

于 2013-03-09T14:09:27.800 回答