Geo*_*lly 8 c gcc shared-libraries
我有一些.so库,我想将它们合并到一个共享库中,这样它就不再依赖于原始.so文件了.
这些.so文件彼此依赖.
我怎样才能做到这一点?我可以这样做吗?
这假设您拥有所有共享对象的源代码:
如果没有名称空间冲突(如果两者并存,则不应该存在),将它们构建到一个共享对象中并不是非常困难.
如果共享库本身依赖于来自另一个库的代码,那么顺序就很重要.真正的工作就是让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.