让两个dll共享一个静态库会有什么陷阱?

时间:2011-09-07 21:18:12

标签: c++ windows dll

假设你有两个dll

Dll A和Dll B

它们都静态链接到静态库(即.lib文件)。我们称之为L库。

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

2 个答案:

答案 0 :(得分:5)

静态库只是目标文件的集合。当您与静态库链接时,一切都会发生,就像静态库的代码已经包含在您的代码中一样。

因此,如果静态库中存在全局变量,则每个DLL都将获得自己的副本,这可能是您想要的也可能不是。

答案 1 :(得分:2)

  

然而,当来自洛杉矶的对象O从A传递到B时会发生什么?

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

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