Linux相当于Windows DLL转发器或MacOS reexport_library

我有一个共享库,试图提供一个标准化的接口,基本上是一个函数列表。 其中一些function已经由另一个共享库提供。 所以我可以只写额外的function,并要求用户链接到这两个库,即让他这样做:

g++ foo.c -lmine -lother 

为了让用户更容易,我不想这样做。 (鉴于我所处的情况,这将比在某些脚本中添加标记更加复杂。)我希望用户只能链接到我的库,并从其他库中获取函数。

在Windows中,我可以使用DLL转发器,并简单列出我想要重新导出的函数。 在MacOS中,我可以使用--reexport_library链接器选项使我的库假装包含另一个。 如果我不介意创build一个完整的其他库的副本,并有一个静态版本,我可以使用--whole-archive ,把它拉进我的图书馆批发。

但是在Linux中有没有办法给我的库的导出表一个“这个函数在那个其他库里面”的条目呢?

或者,还有什么我可以做的,我的图书馆,使得当它被给予链接器时,链接器会说:“哦,我需要拉入其他图书馆呢? --rpath-link选项的文档表明,这应该只是工作,但事实并非如此。 libtool当然会这样做,但libtool不是一个选项。

我当然可以做的只是填充我的图书馆这些function的小存根,但我宁愿不。 如果按照正确的顺序进行重命名,链接器会在正确的时间select正确的版本,那将会非常烦人。 但是,如果真的没有其他办法,任何帮助进行这一点,也将不胜感激。

StackOverflow之外的人给了我一个解决我的问题的方法。

.so文件不需要是真正的ELF文件。 它也可以是一个链接器脚本。 链接器脚本是包含链接器指令的文本文件。 就我而言,脚本非常简单。 我只是将这个文本文件安装为libmine.so

 INPUT ( /install/prefix/lib/libmine.so.1 -lother ) 

这指示链接程序在libmine.so (或-lmine )出现在命令行中的位置查找我的库(带有版本后缀,因此它拾取实际的ELF文件),然后搜索库路径为other图书馆。

然后我用我的构建脚本中的实际配置的安装前缀替换/install/prefix ,我很好。