如何组合共享库?

时间:2009-11-19 10:46:27

标签: c gcc shared-libraries

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

.so个文件彼此有依赖关系。

我该怎么做?我可以这样做吗?

1 个答案:

答案 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。