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

时间:2012-04-25 17:22:38

标签: c++ windows linux dll ambiguous

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

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

假设上面的描述是导致问题的原因,只需更改库的名称以包括说某些版本信息,例如mylib_v1.somylib_v2.so提供防止歧义错误的保护(基础功能) /名称空间名称仍然相同)?我仍然认为不是......但这次我不确定。假设我是对的,我会在我的代码中使用一些宏更改命名空间以在命名空间中包含版本信息(例如,namespace mystuff {}更改为namespace mystuff_v1)至少可以做到这一点吗?感谢您的见解。

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

1 个答案:

答案 0 :(得分:2)

如果应用程序唯一使用一个,则设置PATH和LD_LIBRARY_PATH 这样他们就不会相遇就没有冲突。你可以看到与数百个类似的 msvcrt.dll文件曾随应用程序一起分发,直到Microsoft对其进行排序。

但是,您的(略有不同)代码可能会创建或引用全局资源 可以是碰撞。当然,Windows变体不会使用全局命名的东西,而且 在这里介绍不同的数据结构(存储标准设置的文件,共享内存, ...)。因为这个全局性的东西主要依赖于系统 - 也许你在Windows上做了一些你不在Linux上做的事情......