代码之家  ›  专栏  ›  技术社区  ›  Salo

C++应用程序-我应该使用静态或动态链接库吗?

  •  13
  • Salo  · 技术社区  · 15 年前

    我将启动一个新的C++项目,它依赖于一系列的库,包括一部分Boost库、Log4Cxx或谷歌日志库,并且项目也会演化成其他的(我还不能预料)。

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

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

    笔记:

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

    (3) 我已经阅读了与此主题相关的问题,但无法真正找出哪种方法最适合我的场景。

    结论:

    1. 谢谢大家的意见!
    • 可预测的性能和性能期间更一致的结果。测试(请看本文:http://www.inf.usi.ch/faculty/hauswirth/publications/CU-CS-1042-08.pdf)
    • 正如所指出的,静态和动态编译的大小和持续时间似乎并没有这么大的区别
    • 我可以在我的开发机器上保留所有的开发周期
    4 回复  |  直到 15 年前
        1
  •  11
  •   dicroce    15 年前

    静态链接有一个坏名声。现在我们有巨大的硬盘驱动器,还有非常结实的管道。许多支持动态链接的旧观点现在已经不那么重要了。

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

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

        2
  •  4
  •   Jerry Coffin    15 年前

        3
  •  3
  •   BatchyX    15 年前

    这是对静态链接的又一次投票。我没有注意到应用程序的链接时间明显延长。所讨论的应用程序是一个~50K行的控制台应用程序,有多个库,这些库是为一堆非常普通的机器编译的,大多数是具有100-10000核的超级计算机。通过静态链接,您可以准确地知道将要使用的库,可以轻松地测试它们的新版本。

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

        4
  •  1
  •   wich    15 年前

    最好由打包商决定,并在configure/make脚本中提供这两个选项。通常情况下,动态链接会优先考虑,因为在必要时,即当发现安全漏洞等时,很容易升级库。

    请注意,如果您没有在系统目录中安装库的root权限,则可以编译程序,以便它首先在其他地方查找所需的动态库,这可以通过在ELF二进制文件中设置runpath指令来实现。可以使用链接器ld的-rpath选项指定这样的目录。