2013-02-11 201 views
8

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

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

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

+1

显而易见的解决方案是将修补程序放入主Bullet库中,并将THAT用作系统库。 – 2013-02-11 21:21:26

+0

你能否确保你的修改版本首先被加载并且满足其他库中的所有依赖关系,因此它们不需要系统版本? – 2013-02-11 21:47:36

+1

因此,libopenrave会用子弹库导出子弹符号和链接,而您的插件使用的是完全相同的子弹符号,并随修改后的子弹库一起发货?如果是这样,您可以尝试将修改过的子弹库作为静态库构建,将其链接到您的插件中,并确保插件中的所有项目符号都是隐藏的。您的插件代码将使用它们,但它们不会导出到动态符号表中。如果子弹makefile或代码属性明确设置可见性,则必须破解它,也许在链接对象之前使用binutils更改符号可见性? – 2013-02-11 21:56:32

回答

2

这是一个迂回的方式来完成你想要的,但它击败了子弹代码中的搜索和替换。

您可以尝试使用objcopy工具这样的“前缀”符号子弹库:

objcopy --prefix-symbols=old_ bullet.a 

应该与动态库的工作为好,但你也来试试吧。详细信息请参见this answer