静态链接库的优缺点是什么?

12

我想发布我作为业余爱好开发的应用程序,既可以在Linux上运行也可以在Windows上运行。该应用程序依赖boost(以及可能的其他库)。这种应用程序(国际象棋引擎)的规范是仅提供一个可执行文件和可能的一些辅助文件。

我认为静态链接库会是个好主意,因此可执行文件将不具有任何依赖性。因此,最终用户只需将可执行文件放入目录中并开始使用即可。

然而,在进行一些在线研究时,我发现了一些关于静态链接库的负面评论,甚至有人争论说使用静态链接库的应用程序几乎不可移植,这意味着它只能在我的系统或高度相似的系统上运行。

那么静态链接库的优缺点是什么?

我已经知道可执行文件将变得更大。但我看不出为什么这会使我的应用程序不太可移植。


2
很多重复内容,包括https://dev59.com/J3VC5IYBdhLWcg3w7V_3 - anon
@MathieuL 快速浏览一下,也可以看看https://dev59.com/B0fSa4cB1Zd3GeqPAdRm,它似乎回答了这个问题。如果之前的帖子没有回答你的具体需求,也许你可以在SO中进一步搜索并重新发布一个更精确的问题。 - mjv
4个回答

6

优点:
没有依赖关系。

缺点:
内存使用量较高,因为操作系统不能再使用共享库的副本。
如果需要更新库,则需要重新构建应用程序。对于具有安全修复程序的库而言,这一点尤为重要。

当然,可移植性的更大问题是源代码分发的缺乏。


嗯,除非您静态链接所有内容(包括libc),否则会存在依赖关系,尤其是在使用GNU扩展时。 - Tim Post
3
或许应将“无依赖性”更改为“无额外的运行时依赖”。 - bzim

1
假设您包含的静态库“A”依赖于函数“B”。如果目标系统无法满足此依赖关系,则您的程序将无法运行。
但是,如果您使用动态链接,用户可以安装另一个版本的库“A”,该库使用函数“C”而不是“B”,因此它可以成功运行。

2
这是什么鬼?完全没有意义。静态二进制文件已经与它所需的一切完全链接了。你不需要任何库。怎么可能接受这样的答案... - morphles
4
一个静态链接库永远不可能包含所有内容(否则,甚至必须包括内核;-) - Chris Lercher

0
如果您静态链接库,除非您添加智能功能以检查用户系统中已链接的库,否则您将锁定应用程序以使用这些库的版本,直到更新可执行文件。安全漏洞会发生,更新也会发生。(对于国际象棋引擎可能没有太大问题,但谁知道呢。)

0

使用动态链接库,如果您链接的库X在用户系统上不可用,您的代码会崩溃,让最终用户感到困惑。

而在静态库的情况下,所有内容都被融合到可执行文件中,因此上述条件可能不会发生,但可执行文件会非常庞大。

然而,动态加载可以消除动态链接库中的上述问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接