gpt4 book ai didi

c - 如何使用静态链接到其中的所有库创建 .so 文件?

转载 作者:行者123 更新时间:2023-12-03 19:38:11 25 4
gpt4 key购买 nike

我想创建一个 .so 文件,其中所有库(GMP 和 PROTOBUF)都静态链接到其中,以便它可以在其他系统中使用而无需安装这些库。

这是我为 MAC 所做的:

gcc -I /usr/local/include -shared -o xyz.so -g xyz.c /usr/local/lib/libprotobuf-c.a /usr/local/lib/libgmp.a

但它不适用于 Linux。我怎样才能使它适用于 Linux?

最佳答案

一个共享library应该(在 Linux 上)实际上包含 position-independent code (图片)。所以构建共享库的正确方法libxyz.so来自单个源文件 xyz.c

gcc -Wall -g -shared -I/usr/local/include -o libxyz.so -fPIC xyz.c

(你可以 - 并且可能想要 - 添加 rpath 相关选项)

静态库不包含 PIC(除非它是专门构建的,这在 Linux 上非常不常见;在 Debian 上,我知道的唯一示例是提供的特殊 libc6-pic 包以促进定制和扩展 libc*so 的构建) .

您需要链接这些库的 PIC 变体;所以你应该从他们的源代码构建它们。

阅读 Drepper 的 How To Write Shared Libraries更多信息,还有 Program Library HowTo .

(在一些理论上的奇怪情况下,你可以链接一个不包含 PIC 的共享库,但这会使它们的 dynamic linking 非常慢,因为很多 relocations 将被处理而它们的 code segment 不会在多个进程之间共享 - 通过适当调用 mmap(2)ld-linux(8) 完成;这根本不推荐,非常脆弱,而且通常不会很好地工作;我从来没有这样做过)

I want to create a .so file with all libraries (GMP and PROTOBUF) statically linked into it



不要那样做 .我解释了原因。这样做违反了 Linux 上的(社会)规则(因为您的用户不希望拥有无数的 libgmp 变体等......)。

但是,您可以将共享库与一些以前的其他(更基本的)共享库链接起来。在你的情况下,我建议这样做。所以要求你的用户已经安装了 GMP 和 PROTOBUF 包。

还考虑提供 packages适用于您的(或常见的)Linux 发行版(例如,用于 Ubuntu 或 Debian 的 .deb 文件)

或者,将您的库代码发布为 free software ;然后,您可能希望有几个用户下载它的源代码,也许(最终)某个发行版会打包它。你可以等待数年才能实现;或者至少你得到帮助来打包它。

关于c - 如何使用静态链接到其中的所有库创建 .so 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44780261/

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