2011-09-07 73 views
1

说你有两个DLL让两个dll共享一个静态库有什么缺陷?

DLL中和DLL乙

他们都静态链接到一个静态库(即的.lib文件)。我们将这个库叫做L.

我知道L完全链接到A和B,分别有效地创建LA和LB.但是,当来自LA的对象O从A传递给B时会发生什么?我假设在A LA代码被执行,而在B LB代码被执行,因为那是如何链接发生的。如果你在A中创建O,卸载A,然后在B中使用O,会发生什么坏事?

+1

当您卸载A时,对象O的代码已经消失。试图在O上调用方法将导致运行时错误。 –

+0

@大卫,这是真的吗?或者当在DLL中使用LB代码存在时是O? –

+1

您创建了OA,然后卸载了它后面的代码。那总是以泪水结束。 –

回答

5

静态库只是对象文件的集合。当你与一个静态库链接时,所有事情都会发生,就像静态库的代码已经包含在你的程序中一样。

所以如果静态库中有全局变量,每个DLL都会得到自己的副本,这可能是也可能不是你想要的。

+1

当您尝试创建单例时,这可能真的令人惊讶。 –

+0

这可能是最明显的后果,但我不知道你是否可以扩展 - 虚拟功能会发生什么?在A或B时,哪些代码在对象O上被调用?在这些情况下究竟发生了什么? –

2

但是,当来自LA的对象O从A传递给B时会发生什么?

这实际上取决于什么对象O是什么,以及库L如何处理它。如果O是完全依赖于存储在该对象中的状态的对象,那么一切都可能会很好。但是,如果O不是,则O依赖于全局状态或某个其他对象的状态或某种情况,则可能会出现问题。

避免问题的最佳方法是在两个DLL之间有适当的绝缘层。也就是说,你不应该在两者之间传递O,因为他们不是在谈论相同的O。一般来说,如果L的大小足以要求您在两个用户之间传递其对象,那么它足够大,您可能应该考虑动态链接到它。