共享库名称冲突

时间:2013-02-11 21:06:46

标签: c++ shared-libraries visibility name-clash

我正在分发一个共享库(c ++)和一个使用这个库的python模块。我构建了Bullet Physics Library的修改版本(作为CMake子项目)。 我只在一个文件中使用Bullet类和函数 - bullet_interface.cpp - 并且所有Bullet内容都隐藏在“namespace {...}”中。

问题是其他一些库需要Bullet作为系统依赖项并链接到Bullet的系统版本。实际上,我的库(libopenrave)的一个依赖项导出了Bullet符号。 (更具体地说,它有时会动态加载导出Bullet符号的插件)。

我想知道是否有办法构建我的库,因此bullet_interface.cpp使用正确的Bullet函数,但是我的库不会使任何Bullet符号可见。 我无法使用系统项目符号,因为我必须对源代码进行更改。 一个hacky解决方案是使用搜索和替换重命名所有Bullet函数和类(几乎所有包含字符串“bt”)。还有更好的方法吗?

1 个答案:

答案 0 :(得分:2)

这是完成你想要的东西的一种迂回方式,但它在子弹代码中胜过搜索和替换。

您可以使用objcopy实用程序在子弹库中尝试'前缀'符号,如下所示:

objcopy --prefix-symbols=old_ bullet.a

也应该与动态库一起使用,但您必须尝试它。有关详细信息,请参阅this answer