我有一些.so
个库,我想将它们合并到一个共享库中,以便它不再依赖于原始的.so
文件。
.so
个文件彼此有依赖关系。
我该怎么做?我可以这样做吗?
答案 0 :(得分:8)
这假设您拥有所有共享对象的源代码:
如果没有名称空间冲突(如果两者并存,则不应该存在),将它们构建到一个共享对象中并不是非常困难。
如果共享库本身依赖于来自另一个库的代码,那么顺序就很重要。真正的工作就是让makefile中的依赖项得到解决。我从未在SO的成功链接中看到过循环依赖,所以我怀疑你是否已经开始使用它们。即foo()依赖于bar(),它依赖于foo()。
我已经多次这样做了,尽管图书馆本身也是微不足道的。我从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,每个人都这样做有点不同。它们在制作混搭时非常重要,因为您可能希望避免每次更改一个标题时重新编译整个库。
NB:如果所有三个项目都在使用自动工具..您的任务只会变得更容易(或更难)取决于。
如果您没有源代码
如果每个库都有静态版本,您可以提取对象并使用它们。即:
$ cp /usr/lib/foo.a ./foo.a
$ ar x foo.a
$ gcc -fPIC -shared *.o -o foo.so
当然它比说明的更多涉及。
在这种情况下,我从未尝试过,也不知道如何处理具有main()的SO。