让两个dll共享一个静态库的缺陷是什么?

What are the pitfalls of having a two dlls share a static library?

本文关键字:缺陷 是什么 静态 共享 两个 dll 一个      更新时间:2023-10-16

假设你有两个dll

Dll A和Dll B

它们都静态地链接到一个静态库(即.lib文件)。我们把这个库命名为l。

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

静态库只是对象文件的集合。当你链接一个静态库时,一切都发生了,就好像这个静态库的代码已经包含在你的代码中了。

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

然而,当对象O从LA从A传递到B时会发生什么?

它实际上取决于对象O是什么以及库L对它做什么。如果O是一个完全依赖于存储在该对象中的状态的对象,那么一切可能都很好。然而,如果O不是,如果O依赖于全局状态或一些其他对象或东西的状态,您可能会遇到问题。

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