共享库名称冲突

Shared library name collisions

本文关键字:冲突 共享      更新时间:2023-10-16

我正在分发一个共享库(C++)和一个使用该库的python模块。我构建了子弹物理库的修改版本(作为CMake子项目)。我只在一个文件bullet_interface.cpp中使用Bullet类和函数,所有的Bullet内容都隐藏在namespace { ... }中。

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

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

这是一种实现您想要的功能的迂回方法,但它胜过了项目符号代码中的搜索和替换。

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

objcopy --prefix-symbols=old_ bullet.a

这个也应该与动态库一起使用,但你必须尝试一下。有关详细信息,请参阅此答案。