我有两个“插件”(为了讨论起见,将它们视为软件包中的两个不同应用程序)动态链接到我的库的两个单独构建的版本。我的代码是用 C++ 编写的,并且始终使用一致的命名空间。有时我必须为每个应用程序构建两个不同的版本。当包中的两个应用程序(插件)同时加载时,这似乎会导致一些问题。首先,我需要帮助了解为什么会发生此错误。
例如,我有两个独立但名称相同的库,比如说mylib.so
(或 DLL),每个应用程序都链接到其中一个(唯一)。如果底层代码mylib.so
相同(即名称空间、函数名称等,当然实现略有不同),这会导致问题吗?库的两个副本位于独特的位置这一事实是否足以避免由于歧义或其他链接错误而可能出现的任何问题?我认为显然不是..但我想听听专家的意见。
假设上面的描述是导致问题的原因,是否只是更改库的名称以包含一些版本信息,例如,mylib_v1.so
并mylib_v2.so
提供对歧义错误的保护(底层函数/命名空间名称仍然相同)?我仍然认为不是..但这次我不确定。假设我是对的,那么在我的代码中使用一些宏来更改命名空间以在命名空间中包含版本信息(例如,namespace mystuff {}
更改为namespace mystuff_v1
)至少可以解决问题吗?欣赏您的见解。
注意:令人惊讶的是,歧义只发生在 Windows 上!Linux 能够毫无问题地处理第二段中的情况。