如何组合共享库?

我有一些.so库,我想将它们合并到一个共享库中,这样它就不再依赖于原始的.so文件了。

.so文件彼此依赖。

我怎样才能做到这一点? 我可以这样做吗?

这假设您拥有所有共享对象的源代码:

如果没有名称空间冲突(如果两者并存,则不应该存在),将它们构建到一个共享对象中并不是非常困难。

如果共享库本身依赖于来自另一个库的代码,那么顺序就很重要。 真正的工作就是在makefile中解决依赖关系问题。 我从未在SO的成功链接中看到过循环依赖,所以我怀疑你是否已经开始使用它们。 即foo()取决于依赖于foo()的bar()。

我已经好几次了,虽然图书馆本身很简单。 我从ustr(字符串处理程序),配置文件处理程序,一些其他自定义解析器和其他实用程序函数中获取了部件,并创建了自定义混搭。

一旦你把它们组合在一起,真正的痛苦就是给每个人带来上游改进,但是我不确定这对你来说是不是一个问题。

所以如果你有:

 libfoo.so: $(LIB_FOO_OBJECTS) $(LIB_BAR_OBJECTS) $(LIBFOOBAR_OBJECTS) 

哪里:

 LIB_FOO_OBJECTS = \ $(libfoo)/foo.o \ $(libfoo)/strings.o LIB_BAR_OBJECTS = \ $(libbar)/bar.o .... 

……订单是正确的..其余的很简单。 注意我没有显示标题deps,每个人都这样做有点不同。 它们在制作混搭时非常重要,因为您可能希望避免每次更改一个标题时重新编译整个库。

注意:如果所有三个项目都使用自动工具..你的任务只是指数级更容易(或更难)。

如果您没有源代码

如果每个库都有静态版本,您可以提取对象并使用它们。 即:

 $ cp /usr/lib/foo.a ./foo.a $ ar x foo.a $ gcc -fPIC -shared *.o -o foo.so 

当然它比说明的更多涉及。

我从来没有尝试过,在这种情况下,当涉及链接时,不知道如何处理具有main()的SO。