C++ so文件:从另一个so文件调用的函数

C++ so文件:从另一个so文件调用的函数,c++,c,linux,C++,C,Linux,假设我的可执行文件MyApp动态链接到so文件boost-system.so。我编译了一段时间,一切正常;我对增强系统功能的调用执行了它们应该执行的操作 过了一会儿,我意识到我需要链接到另一个so文件SomeAPI.so。然而,SomeAPI.so静态链接到boost system.a,但它是一个旧的、有缺陷的版本,其函数的名称与“我的”boost系统(当然)完全相同。现在,所有调用(来自MyApp和SomeAPI)都将转到静态链接的SomeAPI版本(或者我的boost系统版本,取决于链接顺序

假设我的可执行文件MyApp动态链接到so文件boost-system.so。我编译了一段时间,一切正常;我对增强系统功能的调用执行了它们应该执行的操作

过了一会儿,我意识到我需要链接到另一个so文件SomeAPI.so。然而,SomeAPI.so静态链接到boost system.a,但它是一个旧的、有缺陷的版本,其函数的名称与“我的”boost系统(当然)完全相同。现在,所有调用(来自MyApp和SomeAPI)都将转到静态链接的SomeAPI版本(或者我的boost系统版本,取决于链接顺序,两者对我都不好)

我希望我的应用程序调用我的boost system版本,SomeAPI使用它的静态链接boost system.a函数。在Windows上,它就是这样工作的


我知道为什么不会发生这种情况,但除了将“我的”boost系统中的名称空间重命名为本地名称外,还有其他方法吗?

用于隐藏不希望其他.so文件看到的函数名称。

您描述的是广泛使用的库的静态链接的主要陷阱。我还想知道是否有一个干净的解决方案。你也尝试过在你的应用程序中静态链接boost吗?我认为实现这一点的唯一方法是重新构建
一些API。因此
的方式不会与
boost系统静态链接。因此
。那么在运行时手动动态加载这两个新的
boost系统如何呢?因此
使用
RTLD\u LOCAL
,然后
SomeAPI.so
?这会不会迫使加载旧的
boost系统.so
for
SomAPI.so
当需要时?我很确定可以构建一些api.so,这样它就不会导出带有链接器脚本的boost系统.a的符号(gcc有时在以前添加了对属性的支持以实现相同的效果,但在您的设置中链接器脚本可能更容易)。我想,但我不确定是否也可以确保boost-system.a中的符号用于某些API。因此,即使boost-system.so已链接。@PetrBudnik,如果我没有弄错的话,boost-system.so的符号只能通过dlsym获得,可能不需要。