gpt4 book ai didi

c++ - dlopen 和隐式库加载 : two copies of the same library

转载 作者:太空狗 更新时间:2023-10-29 12:05:58 25 4
gpt4 key购买 nike

我有 3 个东西:开源应用程序(我们称之为 APP),闭源共享库(我们称之为 OPENGL)和 OPENGL 的开源插件(我们称之为 PLUGIN)[也是共享库]。
操作系统:Linux。

APP和PLUGIN之间需要共享数据,所以APP与PLUGIN链接,当我运行它时,系统自动加载。

APP调用属于OPENGL的eglInitialize后,然后这个函数再次加载 PLUGIN。

之后,我在 APP 内存中有两个 PLUGIN 拷贝。

我知道因为 PLUGIN 有全局数据,调试后我看到有两份全局数据。

那么问题是我该如何解决这种行为?我想要一个 PLUGIN 实例,它被 APP 和 OPENGL 使用。而且我无法更改 OPENGL 库。

最佳答案

这显然在很大程度上取决于库在做什么,但总的来说应该有一些解决方案。

首先请注意,通常情况下,如果多次加载同名共享库,它将继续使用同一个库。这一点主要适用于通过标准加载/链接机制加载。如果库自己调用 dlopen,它仍然可以获得相同的库,但它取决于 dlopen 的标志。尝试阅读 dlopen 上的文档以了解它的工作原理以及如何操作它。

您还可以尝试将 PLUGIN 定位在链接器命令中的较早位置,以便它首先加载,从而避免稍后加载两次。如果您必须动态加载 PLUGIN,这显然无济于事。您还可以检查 LD_PRELOAD 是否可以解析链接顺序。

作为最后的手段,您可能不得不求助于使用 LD_LIBARY_PATH 并将接口(interface)库放入真实库中。这个将简单地将调用传递给真实的,但会拦截重复的负载并将它们分流到之前的负载。

这只是一个需要考虑的大体方向。您的实际答案将在很大程度上取决于您的代码和其他共享库的作用。始终首先调查链接器加载顺序,因为它最容易检查,然后在进入其他选项之前检查 dlopen 标志。

关于c++ - dlopen 和隐式库加载 : two copies of the same library,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12412423/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com