5

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

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

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

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

4

1 回答 1

2

如果应用程序唯一地只使用一个,并且 PATH 和 LD_LIBRARY_PATH 设置为不满足,则不会发生冲突。您可以看到数百个类似的 msvcrt.dll 文件曾经与应用程序一起分发,直到 Microsoft 将其整理出来。

但是,您的(略有不同的)代码可能会创建或引用全局资源,这可能是冲突。确定 Windows 变体不使用全局命名的东西,并在这里引入不同的数据结构?(用于存储标准设置、共享内存等的文件)。由于这种全局性的东西主要依赖于系统——也许你在 Windows 上做了一些你在 Linux 上不做的事情......

于 2012-04-25T18:01:18.143 回答