说你有两个DLL让两个dll共享一个静态库有什么缺陷?
DLL中和DLL乙
他们都静态链接到一个静态库(即的.lib文件)。我们将这个库叫做L.
我知道L完全链接到A和B,分别有效地创建LA和LB.但是,当来自LA的对象O从A传递给B时会发生什么?我假设在A LA代码被执行,而在B LB代码被执行,因为那是如何链接发生的。如果你在A中创建O,卸载A,然后在B中使用O,会发生什么坏事?
说你有两个DLL让两个dll共享一个静态库有什么缺陷?
DLL中和DLL乙
他们都静态链接到一个静态库(即的.lib文件)。我们将这个库叫做L.
我知道L完全链接到A和B,分别有效地创建LA和LB.但是,当来自LA的对象O从A传递给B时会发生什么?我假设在A LA代码被执行,而在B LB代码被执行,因为那是如何链接发生的。如果你在A中创建O,卸载A,然后在B中使用O,会发生什么坏事?
静态库只是对象文件的集合。当你与一个静态库链接时,所有事情都会发生,就像静态库的代码已经包含在你的程序中一样。
所以如果静态库中有全局变量,每个DLL都会得到自己的副本,这可能是也可能不是你想要的。
当您尝试创建单例时,这可能真的令人惊讶。 –
这可能是最明显的后果,但我不知道你是否可以扩展 - 虚拟功能会发生什么?在A或B时,哪些代码在对象O上被调用?在这些情况下究竟发生了什么? –
但是,当来自LA的对象O从A传递给B时会发生什么?
这实际上取决于什么对象O
是什么,以及库L
如何处理它。如果O
是完全依赖于存储在该对象中的状态的对象,那么一切都可能会很好。但是,如果O
不是,则O
依赖于全局状态或某个其他对象的状态或某种情况,则可能会出现问题。
避免问题的最佳方法是在两个DLL之间有适当的绝缘层。也就是说,你不应该在两者之间传递O
,因为他们不是在谈论相同的O
。一般来说,如果L
的大小足以要求您在两个用户之间传递其对象,那么它足够大,您可能应该考虑动态链接到它。
当您卸载A时,对象O的代码已经消失。试图在O上调用方法将导致运行时错误。 –
@大卫,这是真的吗?或者当在DLL中使用LB代码存在时是O? –
您创建了OA,然后卸载了它后面的代码。那总是以泪水结束。 –