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

0 投票
1 回答
1723 浏览
提问于 2025-04-17 20:26

假设我通过创建libA.so这个文件,把一个C++函数扩展到了Python,但libA.so依赖另一个共享库libB.so。我想把libA.so分发给最终用户,并且希望它已经包含(嵌入)了libB.so,也就是说,最终用户不需要单独获取libB.so,也不需要设置他的LD_LIBRARY_PATH去指向包含libB.so的文件夹(如果这个库在最终用户的文件系统中存在的话)。

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

问题1:在Linux中,有办法做到这一点吗?

问题2:这可以通过基于distutils.core配置一个Python设置脚本来实现吗?(可能问题1的答案也会解答这个)

谢谢

1 个回答

1

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

没有。一般来说,UNIX系统(除了AIX)和Linux特别认为 a.outlibfoo.so 是“完全成型”的和“最终的”。它们不能被重新链接。

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

你可以通过将本来应该链接到 libB.so 的对象链接到 libA.so 来实现这一点。

不过要注意,如果你的用户想要自己链接 libB.so,那么你需要特别小心,以免违反一个定义规则。可以通过将所有 libB 的符号隐藏在 libA.so 中来实现这一点(具体步骤在这里)。

另外,做这个可能会有许可证方面的影响——如果 libB 是在GPL下分发的,那么将它链接到 libA 就会创建一个衍生作品,也必须在相同的许可证下分发。

撰写回答