繁体   English   中英

如何创建静态链接到所有库的.so文件?

[英]How do I create .so files with all libraries statically linked into it?

我想创建一个.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?

共享应该(在Linux上)实际上包含与位置无关的代码 (PIC)。 因此,从单个源文件xyz.c构建共享库libxyz.so的正确方法是

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

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

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

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

阅读Drepper的如何编写共享库以获取更多信息,以及Program Library HowTo

(在一些理论上很奇怪的情况下,你可以链接一个不包含PIC的共享库,但这将使它们的动态链接极其缓慢,因为很多重定位将被处理并且它们的代码段不会被共享 -几个进程 - 通过ld-linux(8 完成对mmap(2)的适当调用;这根本不推荐 ,非常脆弱,而且往往效果不好;我从来没有这样做过)

我想创建一个.so文件,其中所有库(GMP和PROTOBUF)静态链接到它

不要那样做 我解释了原因。 这样做是违反Linux上的(社交)规则的(因为你的用户不想拥有数以万计的libgmp变体等等)。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM