【问题标题】:C++: Linking an external library to a dll libraryC++:将外部库链接到 dll 库
【发布时间】:2020-06-05 19:37:32
【问题描述】:

我目前正在使用c++ 在 Windows (dll) 上开发一个共享库。 该库依赖于另一个外部库。

将它们连接在一起的最佳方式是什么?

  • 将外部库作为静态库链接到我的共享库中?
  • 将其链接为共享库并将dll 提供给正在使用我的共享库的应用程序?

对于第二种情况,如果我创建一个使用我自己创建的共享库以及外部库作为共享库的应用程序会发生什么?

例如,如果我的共享库是使用外部库版本 1.1 构建的,并且应用程序使用较新的版本,例如 1.3 ?现在dlls 应该不同了,但我如何将它们提供给主应用程序?

是否有一些关于如何处理这种情况的最佳做法或建议?

【问题讨论】:

    标签: c++ dll shared-libraries static-libraries


    【解决方案1】:

    这实际上取决于您想要做什么以及如何部署您的库。

    共享/动态库(Windows 上的 dll)比静态库有几个优点

    • 它们可以从应用程序外部分发,从而使您的应用程序二进制文件更小
    • 它们可以在应用程序外部更新
    • 它们的效率稍高一些,因为代码仅在需要时才执行,而不是与可执行文件捆绑在一起

    当然他们也有一些弱点

    • 它们可以从您的应用程序外部分发并在外部更新 - 允许 dll 注入攻击
    • 尝试使用可执行文件发布动态库是最痛苦和最可怕的事情之一(尤其是在没有 RPATH 的 Windows 上)

    您可能必须使用 dll,这取决于您的外部库许可,例如 Qt 在许多情况下(不是全部)需要共享库链接。

    标准约定通常是提供库的共享和静态版本,共享版本完全链接到其他共享库,静态版本是 ar 静态库(包括所有依赖项)。然后共享库变体提供有关链接的说明(即.pc (pkgconfig) 文件),它指定要链接到的其他库的版本(即x.dllv1.1)以便成功编译/链接。

    【讨论】:

    • 如果我使用 Visual Studio 构建它,静态版本应该将所有依赖项链接为静态(如果可能)?
    • 是的,一般情况下是这样的,静态库包含所有依赖项,共享库希望用户链接依赖项
    • 你知道 Visual Studio /MT 和 /MD 中的编译器选项如何影响库的构建吗?
    • /MT为静态联动,/MD为动态联动
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-25
    • 1970-01-01
    • 2021-09-17
    相关资源
    最近更新 更多