如何将共享库嵌入另一个库中?
假设我通过创建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.out
和 libfoo.so
是“完全成型”的和“最终的”。它们不能被重新链接。
我想创建一个不引用任何其他(静态或共享)库的共享库 libA.so。
你可以通过将本来应该链接到 libB.so
的对象链接到 libA.so
来实现这一点。
不过要注意,如果你的用户想要自己链接 libB.so
,那么你需要特别小心,以免违反一个定义规则。可以通过将所有 libB
的符号隐藏在 libA.so
中来实现这一点(具体步骤在这里)。
另外,做这个可能会有许可证方面的影响——如果 libB
是在GPL下分发的,那么将它链接到 libA
就会创建一个衍生作品,也必须在相同的许可证下分发。