gpt4 book ai didi

c++ - 链接到具有不同实现(代码)的同名 DLL 或共享库对象 (so) 的两个插件

转载 作者:IT王子 更新时间:2023-10-29 00:39:23 27 4
gpt4 key购买 nike

我有两个“插件”(为了便于讨论,将它们视为软件包中的两个不同应用程序)动态链接到我的库的两个单独构建的版本。我的代码是用 C++ 编写的,并且始终使用一致的命名空间。有时我必须构建两个不同的每个应用程序的版本。当两个应用程序(插件)时,这似乎会导致一些问题在包中同时加载。首先,我需要帮助理解为什么会出现此错误。

例如,我有两个独立但名称相同的库,比如说 mylib.so(或 DLL),每个应用程序都链接到(唯一的)其中一个。如果 mylib.so 中的底层代码是相同的(即命名空间、函数名称等,当然实现略有不同)这是否会导致问题?库的两个拷贝位于唯一的位置这一事实是否足以避免由于歧义或其他链接错误而可能出现的任何问题?我认为显然不是......但我想听听专家对此的看法。

假设上面的描述是导致问题的原因,将仅更改库的名称以包含一些版本信息,例如 mylib_v1.somylib_v2.so 提供防止歧义错误的保护措施(底层函数/命名空间名称仍然相同)?我仍然认为不是.. 但这次我不确定。假设我是对的,是否可以在我的代码中使用一些宏更改命名空间以在命名空间中包含版本信息(例如,namespace mystuff {} 更改为 namespace mystuff_v1)就可以了至少?感谢您的见解。

注意:令人惊讶的是,这种歧义只发生在 Windows 上! Linux 能够毫无问题地处理第二段中的情况。

最佳答案

如果应用程序唯一地只使用一个,并且设置了 PATHs 和 LD_LIBRARY_PATHs这样他们不见面就没有冲突。你可以看到数百个类似的msvcrt.dll 文件曾经与应用程序一起分发,直到 Microsoft 解决了这个问题。

但是,您的(略有不同的)代码可能会创建或引用全局资源,这里可以是碰撞。确保 Windows 变体不使用全局命名的东西,并且这里介绍不同的数据结构? (文件存储标准设置,共享内存,...)。由于这种全局性的东西大部分都非常依赖于系统 - 也许你在 Windows 上做了一些你在 Linux 上没有做的事情......

关于c++ - 链接到具有不同实现(代码)的同名 DLL 或共享库对象 (so) 的两个插件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10320658/

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