如何将共享库嵌入另一个库?

时间:2014-03-01 16:40:22

标签: python c++ linker shared-libraries embedded-resource

假设我通过创建 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 个答案:

答案 0 :(得分:1)

  

问题1:有没有办法在linux中执行此操作?

没有。一般的UNIX系统(除了AIX之外),特别是Linux,考虑a.outlibfoo.so“完全熟”和“最终”。没有办法重新链接它们。

  

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

可以通过将已链接到libB.so对象链接到libA.so来实现这一点。

但是请注意,如果您的用户想要自己链接libB.so,那么您需要格外小心,不要违反one definition rule。这可以通过隐藏libB内的所有libA.so个符号来实现(说明here)。

另请注意,执行此操作可能会产生许可影响 - 如果libB在GPL下分发,则将其链接到libA会创建衍生作品,并且必须在同一许可下分发。