如何将共享库嵌入到另一个共享库中

How to embed a shared library into another one?

本文关键字:共享 另一个      更新时间:2023-10-16

假设我通过创建 libA.so 将C++函数扩展到python,但 libA.so 也依赖于另一个共享库 libB.so。我想以已经包含(嵌入)libB.so 的方式将 libA.so 分发给最终用户,即最终用户不需要获取 libB.so 或将他/她的LD_LIBRARY_PATH设置为指向包含 libB.so 的文件夹(如果此库存在于最终用户的文件系统中)。

所以基本上我想创建一个共享库 libA.so 它不引用任何其他(静态或共享)库。

问题1:有没有办法在linux中做到这一点?

问题2:这可以通过配置基于distutils.core的python安装脚本来完成吗?(可能问题 1 也会提供答案)

谢谢

问题1:有没有办法在linux中做到这一点?

不。一般的UNIX系统(AIX除外),特别是Linux,认为a.outlibfoo.so"完全熟食"和"最终"。无法重新链接它们。

我想创建一个共享库 libA.so 它不引用任何其他(静态或共享)库。

为此,您可以将本来链接到libB.so的对象链接到libA.so中。

但请注意,如果您的用户想要自己链接到libB.so,那么您需要格外小心,不要违反一个定义规则。这可以通过将libB的所有符号隐藏在libA.so内来实现(说明在这里)。

另请注意,这样做可能会涉及许可问题——如果libB是在 GPL 下分发的,那么将其链接到 libA 会创建一个衍生作品,该作品也必须在同一许可证下分发。