【问题标题】:Boost - "static" vs "shared" librariesBoost - “静态”与“共享”库
【发布时间】:2009-09-15 21:29:27
【问题描述】:

我正在从 boost 源代码构建“boost”库,我有两个选择:构建它“静态”或构建它“共享”(例如动态)。 哪个更好?

我更喜欢动态(共享)链接,但是当我尝试构建 boost 共享库(在 Ubuntu Linux 上)时,我收到了很多错误或警告(为什么编译时总是出现错误、警告、注释和其他东西,grrrrrrrrr) ,所以不知道编译好不好?

谢谢。

【问题讨论】:

  • 在此处发布错误日志。

标签: c++ boost compilation


【解决方案1】:

更好是主观的。共享减少了大小,但存在依赖关系的风险。静态解决了依赖问题,但增加了大小。

出于您的目的,我会说构建它以使您更快地编写代码是更好的解决方案。

【讨论】:

  • 静态库和动态库可能都有外部依赖。
【解决方案2】:

您几乎总是希望使用共享库而不是静态库。使用共享库的一个关键优势是,如果更新了库,您可以将共享库替换为较新的版本(假设二进制兼容性),并且无需重新编译应用程序即可获得改进实现的好处。此外,如果多个程序正在使用共享库,则使用共享库可以节省空间。

至于依赖问题,可以链接到特定版本的共享库,或者将共享库放置在特定于程序的特殊位置——这不会节省空间,但这确实为您提供了与共享库相关的灵活性——因此这不应该成为选择静态库而不是共享库的理由。实际上,我很难在典型的台式机、笔记本电脑或服务器机器上想出一个实例,其中使用静态库比使用共享库更好。

附:如果您尝试在 Ubuntu Linux 上安装 Boost,只需运行“sudo apt-get install libboost1.37-dev”。您可能会遇到错误,因为您没有安装 Boost 的所有依赖项。当您使用 Ubuntu 的 apt-get 包管理器安装它时,它们会自动下载和安装。此外,通常最好使用操作系统包管理器来安装软件包,而不是从源代码构建。例如,使用包系统版本的 Boost 将使您的软件更有可能在使用包管理器版本的 Boost 的其他 Ubuntu Linux 部署上顺利运行。

附言Boost 使用了 C++ 的一些非常高级的特性。它有点将 C++ 推向了极限。在编译 Boost 时看到警告并不少见。事实上,我已经在各种操作系统上构建了很多次 Boost,我不记得没有任何警告的时候。

【讨论】:

  • 您可能希望静态链接而不是共享的一个实例是,如果您使用的库不属于您将编译的二进制文件分发到的机器的典型基本安装的一部分。静态链接库意味着不需要在目标机器上安装包。
【解决方案3】:

当您不需要将组件动态加载到程序中时,可以使用静态库。它被编译成exe。
共享库在运行时加载,通常用于插件或扩展。
Imo 在这里使用静态库更好,因为您可能会在程序启动时加载 boost 共享库。
为什么更喜欢共享库?

【讨论】:

    【解决方案4】:

    在 Linux 上使用 Boost C++ 库的推荐方法是通过共享链接。在已经为开发配置的 Ubuntu Linux 机器上,您根本不会遇到任何错误。预计会出现编译警告——对于各种心态、技术和时间限制问题,都会产生一些警告。由于定期发布测试涵盖 Ubuntu,我不会担心创建的库的功能——如果有 .so,它应该可以工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-19
      • 1970-01-01
      • 1970-01-01
      • 2011-03-31
      • 1970-01-01
      相关资源
      最近更新 更多