代码之家  ›  专栏  ›  技术社区  ›  Georg Schölly Crazy Developer

如何组合共享库?

  •  7
  • Georg Schölly Crazy Developer  · 技术社区  · 15 年前

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

    这个 所以 文件相互依赖。

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

    1 回复  |  直到 15 年前
        1
  •  8
  •   Tim Post Samir J M Araujo    15 年前

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

    如果没有名称空间冲突(如果两个名称空间是共存的,就不应该有冲突),那么将它们构建成一个共享对象就不会太难了。

    如果共享库本身依赖于另一个库的代码,那么顺序就很重要了。真正的工作就是在makefile中计算出依赖项。我从来没有在so的成功链接中看到过循环依赖,所以我怀疑您是否需要从它们开始。即foo()依赖于bar(),而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,每个人都有点不同。但是,在进行mash-ups时,它们很重要,因为您可能希望避免每次更改一个头时重新编译整个库。

    NB: 如果这三个项目都使用自动工具…你的任务只是成倍地容易(或难)取决于。

    如果您没有源代码

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

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

    当然,这比图示要复杂得多。

    我从未尝试过,也不知道如何处理在这种情况下链接时具有main()的sos。