1

在我的以下场景中:

  • libA.so 库链接 libCommon.so
  • libB.so 库还链接 libCommon.so
  • 即使两个库链接相同的 libCommon.so,它们也会设置不同的 libCommon.so 配置

             --> libA.so --> libCommon.so
            /
    ProgramA
            \
             --> libB.so --> libCommon.so
    
    
    
             --> libA.so
            /           \
    ProgramA              --> libCommon.so
            \           /
             --> libB.so
    

我的程序会共享相同的 libCommon.so 副本还是使用不同的副本?正如我之前提到的,libCommon.so 与不同的设置一起使用。理想情况下,我希望它像第一张图一样,libCommon.so 在内存中有不同的副本。我试图避免调用一个副本影响另一方的行为。

4

1 回答 1

1

简短的回答:你得到第二张图。这通常是大多数开发人员想要的,否则动态链接的好处就会减少。允许在同一个进程中进行多个实例化实际上取决于 libCommon 的实现——通常通过避免库中的全局变量来维护导出函数调用之间的状态来实现。

您是否维护 libCommon 的源代码?如果是这样,那么探索修复它的方法,使其使用基于“会话”,而不是在全局变量中维护所有状态。

如果没有,那么您是否维护 libA 或 libB 的源代码?您基本上可以通过将 libA 和 libB 中的一个或两个静态链接到 libCommon.a 而不是 libCommon.so 来获得第一个图表 - 这假定存在 libCommon.a 的静态编译版本。

于 2013-03-10T04:20:16.037 回答