我在这里看到了几个关于这个主题的讨论,但是想问一下我的具体情况:
如果我有一些我的应用程序正在使用的第三部分库,并且我想将它们链接在一起以便在LD_LIBRARY等中节省自己的麻烦,那么它在Linux上是否有任何缺点,除此之外更大文件大小?
另外,是否可以静态链接某些库和其他(标准Linux库)以动态链接?
感谢。
答案 0 :(得分:4)
确实可以动态链接某些库并静态链接其他库。
听起来你真正想做的是动态地链接系统库,并静态链接用户可能没有安装的非标准(或不同的用户可能有不同的安装)。
这是完全合理的。
静态链接系统库通常不是一个好主意,尤其是libc。
静态链接与操作系统不附带且不会随应用程序一起分发的库通常是有意义的。
答案 1 :(得分:2)
有一些libc - 使用nsswitch的那些 - 需要动态加载库。如果要生成完全静态的二进制文件,这可能会导致问题。
将您的第三方库静态链接到您的应用程序应该完全没问题。
答案 2 :(得分:1)
静态链接的二进制文件将比您使用共享库时更大,但我发现,如果我控制所涉及的所有库的分布,那么库路径的缺点会超重。如果您依赖于特定的发行版共享库,那么您别无选择,只能使用动态链接。
答案 3 :(得分:1)
要回答第二个问题,是的,可以将动态和静态库链接到同一个应用程序。请注意避免馆际互联,这样您就不会遇到库顺序问题。您应该能够以任意顺序列出库。在我工作的地方,我们更喜欢按字母顺序列出它们。
编辑:要链接静态库,请使用标志-lfoo。要将目录添加到库搜索路径,请使用-L / path / to / libfoo。
修改:您不必链接动态库。您的程序可以使用编译器提供的函数在运行时打开动态库,也可以在编译时链接它,编译器将解析符号但不包括在二进制文件中。请参阅下面的pjc50评论。
答案 4 :(得分:1)
我看到的主要缺点是您的应用程序丢失了可能应用于共享库的任何自动错误修正。另一方面,你不会遇到新的错误。
答案 5 :(得分:1)
静态链接不仅会影响库的文件大小,还会影响应用程序的内存占用和启动时间。无论有多少程序使用动态链接库,都会加载动态链接库。每个使用它们的程序必须加载一次静态链接库(因为它们现在是该程序的一部分)。
答案 6 :(得分:0)
静态链接会使您的二进制文件变得庞大,但您不需要在目标运行时环境中拥有该库的共享版本。在开发嵌入式应用程序时尤其如此。