将针对msvcrt.dll编译的库链接到Visual Studio 10 c++应用程序中

Linking libs compiled against msvcrt.dll into a Visual Studio 10 C++ app

本文关键字:Studio Visual c++ 应用程序 链接 msvcrt dll 编译      更新时间:2023-10-16

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

这是关于库的页面:

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

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

那一页上写着:

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

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

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

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

没有问题在对不同运行时DLL链接的版本中,只要他们不通过类型定义的CRT DLL之间(std::vector它们可能有不同的实现,例如,所以传递这样一个物体从一个DLL与msvcr100.dll DLL与msvcrt.dll可能会造成问题,只要在一个DLL你不分配内存,并释放它在另一个(再一次,他们可能会有不同的malloc/free实现,或者使用不同的堆)

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

通常在您创建或使用的DLL中,它们将依赖于msvcrt的编号版本,例如:msvcrt90.dll或其调试版本:msvcrt90d.dll。或者msvcrt100.dll/msvcrt100.dll。这些DLL包含所谓的C运行时库的实现。也许你混淆了这个msvcrt.dll和我上面命名的那些?这是两码事。

我听说msvcrt.dll是微软自己的内部版本的操作系统。你根本不需要为DLL而担心、思考、摇头、愁眉苦脸或失眠。

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

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