【发布时间】:2014-03-31 14:47:36
【问题描述】:
我有一个共享库,它试图提供一个标准化的接口,基本上是一个函数列表。其中一些功能已经由另一个共享库提供。所以我可以只编写附加函数并要求用户链接到这两个库,即让他这样做:
g++ foo.c -lmine -lother
但是,为了让用户更轻松,我不想这样做。 (考虑到我所处的情况,这比在某些脚本中添加标志要复杂得多。)我希望用户只链接我的库并从另一个库中获取函数。
在 Windows 中,我可以使用 DLL 转发器并简单地列出我想要重新导出的函数。在 MacOS 中,我可以使用 --reexport_library 链接器选项让我的库假装包含另一个库。如果我不介意创建另一个库的完整副本并拥有静态版本,我可以使用上面的 --whole-archive 将其批量拉入我的库中。
但是在 Linux 中有什么方法可以给我的库的导出表一个条目,上面写着“这个函数在那边的另一个库中”?
或者,我可以对我的库做些什么,这样当它被提供给链接器时,链接器会说,“哦,我也需要拉入另一个库”? --rpath-link 选项的文档表明这应该可以工作,但事实并非如此。 libtool 当然会这样做,但 libtool 不是一个选项。
我当然可以做的只是用这些函数的小存根填充我的库,但我宁愿不这样做。必须以正确的顺序重命名以便链接器在正确的时间选择正确的版本,这将是非常烦人的。但如果真的没有其他办法,也将不胜感激。
【问题讨论】:
-
Er.. 如果
.so与-lsomething链接,它将拉取这个库。它是一种广泛使用的方法,例如libpng拉libz等。我不明白这个问题。 -
用户代码可能直接引用来自
something的符号,如果-lsomething不在命令行上,链接器将不会接受这一点。 -
有没有办法在 Windows 上重新导出库中的所有符号,而不必包装每个符号?
-
@Andrew 我不知道,但你为什么不把这个当作一个真正的问题来问?
-
我引用了这个问题和您相关的 clang 开发者邮件here。
标签: linux linker shared-libraries