C++:将外部库链接到 DLL 库

3
我正在使用C++在Windows上开发一个共享库(dll)。该库依赖于另一个外部库。
最佳的链接方式是什么?
1. 将外部库作为静态库链接到我的共享库中? 2. 将其链接为共享库,并向使用我的共享库的应用程序提供DLL?
如果选择第二种方式,如果我创建一个应用程序,并使用我自己创建的共享库和一个外部库作为共享库,会发生什么?
例如,如果我的共享库是使用外部库版本1.1构建的,而应用程序使用更新的版本,例如1.3?现在DLL应该是不同的,但我该如何将它们提供给主应用程序?
是否有一些最佳实践或建议来处理这种情况?
1个回答

1

这取决于你想做什么以及你如何部署你的库。

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

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

当然,它们也有一些弱点

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

根据您的外部库许可证,您可能需要使用dll,例如Qt在许多情况下需要共享库链接(并非所有情况都是如此)。

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


如果我使用Visual Studio构建它,静态版本应该尽可能地将所有依赖项链接为静态的吗? - Kevin
是的,这通常是这样做的。静态库包括所有依赖项,共享库则要求用户链接依赖项。 - Object object
你知道Visual Studio中编译器选项/MT和/MD如何影响库的构建吗? - Kevin
/MT 是静态链接,/MD 是动态链接。 - Object object

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