13

我将开始一个新的 C++ 项目,该项目将依赖于一系列库,包括 Boost 库、log4cxx 或 google 日志库的一部分——并且随着项目的发展,其他项目也会发展(我还不能预料到) .

它必须在 32 位和 64 位系统上运行,很可能在一个非常多样化的 Linux 环境中,我不希望拥有所有必需的库或 su 权限。

我的问题是,我应该通过动态或静态链接到所有这些库来构建我的应用程序吗?

笔记:

(1) 我知道静态链接在开发过程中可能会很痛苦(更长的编译时间、32 位和 64 位的交叉编译、向下依赖链以包含所有库等),但在测试期间要容易得多 -只需移动文件并运行。

(2) 另一方面,动态链接接缝在开发阶段更容易 - 编译时间短,(真的不知道如何处理从我的 32 位开发环境到 64 位库的动态链接),没有依赖链的喧嚣。另一方面,新版本的部署可能很难看——尤其是在需要新库时(请参阅上面的条件,即在目标机器上没有 su 权限,也没有这些库可用)。

(3) 我已经阅读了有关该主题的相关问题,但无法真正弄清楚哪种方法最适合我的情况。

结论:

  1. 谢谢大家的意见!
  2. 我可能会使用静态链接,因为:
    • 更容易部署
    • 在 perf 期间可预测的性能和更一致的结果。测试(看这篇论文:http://www.inf.usi.ch/faculty/hauswirth/publications/CU-CS-1042-08.pdf)
    • 正如所指出的,静态与动态编译的大小和持续时间似乎并没有那么大的差异
    • 更容易和更快的测试周期
    • 我可以保留所有开发人员。在我的开发中循环。机器
4

4 回答 4

12

静态链接名声不好。这些天我们有巨大的硬盘驱动器和非常胖的管道。许多支持动态链接的旧论点现在已经不那么重要了。

另外,在 Linux 上更喜欢静态链接有一个非常好的理由:过多的平台配置使得几乎不可能保证您的可执行文件即使在没有静态链接的情况下也能在其中一小部分上工作。

我怀疑这不会是一个流行的观点。美好的。但我有 11 年在 Linux 上部署应用程序的经验,直到像 LSB 这样的东西真正起飞并真正扩展它的范围之前,Linux 上部署应用程序将继续变得更加困难。在那之前,如果您必须在各种平台上运行,请静态链接您的应用程序。

于 2010-01-19T18:09:36.553 回答
4

我可能会在(大部分)开发期间使用动态链接,然后在开发的最后阶段和(所有)部署中切换到静态链接。幸运的是,当从库的动态链接切换到静态链接时,几乎不需要额外的测试。

于 2010-01-19T17:17:57.853 回答
3

这是对静态链接的另一个投票。我没有注意到应用程序的链接时间明显更长。有问题的应用程序是一个约 50K 行的控制台应用程序,具有多个库,这些库是为一堆不寻常的机器编译的,主要是具有 100-10,000 个内核的超级计算机。使用静态链接,您可以准确地知道要使用哪些库,可以轻松测试它们的新版本。

通常,这是大多数 Mac 应用程序的构建方式。它允许安装简单地将目录复制到系统上。

于 2010-01-19T18:16:28.643 回答
1

最好的办法是把它留给打包程序,并在配置/制作脚本中提供这两个选项。通常动态链接会优先考虑,因为这样在必要时升级库会很容易,即当发现安全漏洞等时。

请注意,如果您没有在系统目录中安装库的 root 权限,您可以编译程序,使其首先在别处查找任何需要的动态库,这是通过在 ELF 二进制文件中设置 runpath 指令来完成的。您可以使用链接器 ld 的 -rpath 选项指定这样的目录。

于 2010-01-19T17:19:53.483 回答