我有一个共享库,试图提供一个标准化的接口,基本上是一个功能列表.其中一些功能已由另一个共享库提供.因此,我可以编写其他功能,并要求用户链接到两个库,即让他这样做:
g++ foo.c -lmine -lother
为了使用户更轻松,我不想这样做. (鉴于我所处的情况,这比在某些脚本中添加标志要复杂得多.)我希望用户仅链接到我的库,并从其他库中获取功能.
在Windows中,我可以使用DLL转发器,并简单列出要重新导出的功能.在MacOS中,我可以使用–reexport_library链接器选项来使我的库假装包含另一个库.如果我不介意创建另一个库的完整副本并使用静态版本,则可以使用–whole-archive将其整体导入我的库中.
但是在Linux中,有什么方法可以给我的库的导出表一个条目说“此函数在那边的另一个库中”?
或者,我可以对我的库做些什么,使它提供给链接器时,链接器会说:“哦,我也需要拉入另一个库”? –rpath-link选项的文档建议这样做应该可以,但不能.当然,libtool可以做到这一点,但是libtool并不是一个选择.
我当然可以做的就是在我的库中填充这些功能的小存根,但我宁愿不这样做.只是必须以正确的顺序进行重命名,以使链接器在正确的时间选择正确的版本,这真是令人讨厌.但是,如果真的没有其他方法,那么继续进行此操作的任何帮助也将不胜感激.
解决方法:
*之外的人给了我解决问题的方法.
.so文件不必是实际的ELF文件.它也可以是链接描述文件.链接描述文件是一个文本文件,其中包含链接描述.就我而言,脚本非常简单.我只是将这个文本文件安装为libmine.so:
INPUT ( /install/prefix/lib/libmine.so.1 -lother )
这指示链接器在命令行上出现libmine.so(或-lmine)的位置,以查找我的库(带有版本后缀,因此它将提取实际的ELF文件),然后搜索库路径对于其他图书馆.
然后,我只需在构建脚本中将/ install / prefix替换为实际配置的安装前缀,就可以了.