squ*_*boo 5 c++ linux windows dll ambiguous
我有两个"插件"(将它们视为软件包中的两个不同的应用程序以供讨论),它们动态链接到我的库的两个单独构建的版本.我的代码是用C++编写的,并且始终使用一致的命名空间.有时我必须为每个应用程序构建两个不同的版本.当同时加载包中的两个应用程序(插件)时,这似乎会导致一些问题.首先,我需要帮助理解为什么会出现此错误.
作为一个例子,我有两个独立但名称相同的库,比如说mylib.so(或DLL),每个应用程序都链接到(唯一的)其中一个.如果底层代码mylib.so是相同的(即命名空间,函数名称等,当然实现略有不同),这会导致问题吗?这两个库的副本是否位于足以避免因模糊或其他链接错误而可能出现的任何问题的独特位置?我想清楚不是..但我想听听专家的意见.
假设上面的描述是引起问题的原因,只是更改库的名称以包括说某些版本信息,例如,mylib_v1.so并mylib_v2.so提供防止歧义错误的保护(基础函数/命名空间名称仍然相同)?我仍然认为不是......但这次我不确定.假设我是对的,我会在我的代码中使用一些宏来更改命名空间,以便在命名空间中包含版本信息(例如,namespace mystuff {}更改为namespace mystuff_v1)至少可以做到这一点吗?欣赏您的见解.
注意:令人惊讶的是,模糊性只发生在Windows上!Linux能够毫无问题地处理第二段中的情况.
小智 2
如果应用程序唯一地仅使用一个,并且设置 PATH 和 LD_LIBRARY_PATH 以使它们不匹配,则不会发生冲突。您可以看到曾经与应用程序一起分发的数百个类似的 msvcrt.dll 文件,直到 Microsoft 解决了这个问题。
但是,您的(略有不同)代码可能会创建或引用全局资源,这可能会发生冲突。当然 Windows 变体不使用全局命名的东西,并且在这里引入了不同的数据结构?(用于存储标准设置、共享内存等的文件)。由于这些全局性的东西大部分都非常依赖于系统 - 也许你在 Windows 上做了一些在 Linux 上不做的事情......
| 归档时间: |
|
| 查看次数: |
153 次 |
| 最近记录: |