如何组合共享库?

Geo*_*lly 8 c gcc shared-libraries

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

这些.so文件彼此依赖.

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

Tim*_*ost 8

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

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

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

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

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

所以如果你有:

libfoo.so: $(LIB_FOO_OBJECTS) $(LIB_BAR_OBJECTS) $(LIBFOOBAR_OBJECTS)
Run Code Online (Sandbox Code Playgroud)

哪里:

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

LIB_BAR_OBJECTS = \
     $(libbar)/bar.o
 ....
Run Code Online (Sandbox Code Playgroud)

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

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

如果您没有源代码

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

$ cp /usr/lib/foo.a ./foo.a
$ ar x foo.a
$ gcc -fPIC -shared *.o -o foo.so
Run Code Online (Sandbox Code Playgroud)

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

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