gpt4 book ai didi

c - 如何合并共享库?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:52:44 27 4
gpt4 key购买 nike

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

.so 文件相互依赖。

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

最佳答案

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

只要不存在命名空间冲突(如果两者共存则不应该存在冲突),将它们构建到一个共享对象中并不会太难。

如果共享库本身依赖于另一个库中的代码,那么顺序就会很重要。真正的工作只是在 makefile 中解决依赖关系。我从来没有在 SO 的成功链接中看到循环依赖,所以我怀疑你是否有它们开始。 IE。 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
....

...而且顺序是正确的..剩下的就很简单了。请注意,我没有显示 header deps,每个人做的都有点不同。不过,它们在制作混搭时很重要,因为您可能希望避免每次一个 header 更改时都重新编译整个库。

注意:如果所有三个项目都使用 autotools ..你的任务就会变得更容易(或更难),具体取决于。

如果您没有源代码

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

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

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

我从来没有尝试过,也不知道在那种情况下如何处理具有 main() 的 SO。

关于c - 如何合并共享库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25715265/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com