【问题标题】:How to embed a shared library into another one?如何将共享库嵌入到另一个库中?
【发布时间】:2014-03-01 16:40:21
【问题描述】:

假设我通过创建 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 也会提供答案)

谢谢

【问题讨论】:

  • 您不能将.so 文件嵌入到另一个.so 文件中。如果它是一个.a 文件或一堆.o 文件,则可以使用ar 轻松完成,然后静态链接到。 might 可以将两个 .so 文件嵌入到您的应用程序中并在运行时提取它,然后使用 dlopendlsym 加载它。
  • libB.a附加到要编译的文件列表中。
  • 有没有办法将 libB.so 转换为 libB.a 以便可以使用 ar(顺便问一下,这是一个链接器选项吗?)?

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


【解决方案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 会创建一个衍生作品,该衍生作品也必须在同一许可下分发。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-21
    • 2013-10-25
    • 2019-04-17
    • 1970-01-01
    • 2017-04-06
    • 2020-11-18
    相关资源
    最近更新 更多