2013-03-09 81 views
2

我需要在我的应用程序中使用一些针对msvcrt.dll编译的DLL。我已经试过了,好像好像是。我的第一个担心是对msvcrt.dll有额外的依赖性;我已经包括Visual Studio 10运行时库,并希望不必添加更多。我知道msvcrt.dll总是在窗口系统文件夹中,但我应该依靠这个吗?将针对msvcrt.dll编译的库链接到Visual Studio 10 C++应用程序中

以下是有关库页:

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

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

有该网页上一点,上面写着:。

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

这就是我所担心的。它可能看起来是很好的时刻,但我担忧的时候是出于对具有不同设置其他系统野外会发生什么事..

回答

3

我知道MSVCRT.DLL总是在窗口系统文件夹,但我应该依靠这个吗?

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

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

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

+0

+1指出所有DLL的最终依赖于msvcrt.dll – 2013-03-09 14:10:14

+0

谢谢,这几乎涵盖了我的顾虑。关于内存分配和释放,是否可以使用库中包含的函数调用完成?在这种情况下,我从我的应用程序调用:xmlInitParser(),后来分别分配和释放内存的xmlCleanupParser()。 – Mark 2013-03-09 14:41:40

+0

是的,如果DLL A调用释放内存的DLL B中定义的函数,那么内存是由DLL B发布,所以(假设B是分配它的人),你是免费的。 :)只要它通过这样的包装函数完成,你确保相同的DLL将执行这两个操作 – jalf 2013-03-09 14:46:35

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将拒绝启动你的应用程序应用程序。它会给你一个神秘的信息,你将不得不谷歌找出。

+0

没有混淆,我的担心是关于混合这两个。我已经使用msvcrt100.dll部署应用程序。感谢您的回答,虽然:-) – Mark 2013-03-09 14:37:47

相关问题