将应用程序部署为静态或dynamic构build的最佳实践是什么?

我打算发布和部署一个用C ++和wxWidgets编写的应用程序。 wxWidgets库可以作为DLL和静态库一样使用。 因此,我可以select将应用程序部署为dynamic构build的应用程序或静态构build。

目前,我更喜欢静态生成选项,因为:

  • 可执行文件不是太大(<20 MegaByte)。
  • 有没有依赖考虑。
  • 不需要安装。

我错过了非常重要的事情吗?

我的建议是去静态链接 。 我的两分优势:

  • 您不依赖于在客户端站点上安装的WX工具集,您既不需要将其与安装程序捆绑在一起,也不要将其作为独立安装程序作为先决条件
  • 您不要指望或要求客户进行WX安装(甚至是XCOPY部署)。 客户不会打扰!
  • 互联网速度方面,全世界的TB和20 MB的互联网速度都不错。
  • 如果碰巧使用更高/更低版本的库,则不会从客户那里获得意外的行为错误。
  • 您可以确信,应用程序的工作方式与您在环境中测试的方式(主要是)
  • 即使有bug /华丽的X + 1版本出现,您仍然可以继续使用X版本的WX。 你不想让客户有“更新,更精致”的图书馆版本,这会破坏你的应用程序!

当有充分的理由使用它时,应该使用动态链接,否则使用静态链接。 使用动态链接的一些很好的理由是:

  1. 您正在为已经拥有或可能具有wxWidgets库的系统(如多个Linux发行版,OS X(具有Homebrew)等)分发二进制文件。在这种情况下,强烈希望重新使用现有的系统库,而不是使用你自己的。
  2. 你有几个使用wxWidgets的模块:使用动态链接节省空间在这里可能非常重要。
  3. 您可以使用MSW下的DLL中的wxWidgets:在这种情况下,wxWidgets本身也应该作为一个DLL来链接,否则如果wxWidgets的多个实例被加载到进程地址空间中,您可能会遇到问题。
  4. 您计划通过网络更新您的应用程序的安装:在这种情况下,能够更新只是一个DLL而不是整个单片应用程序可能是很好的。

如果这两个原因都不适用,例如你只是想在MSW下分发一个程序,那么静态链接就更简单了。

一个相关的注意事项:如果你最终分发wxWidgets DLLs,考虑为它们使用一个唯一的后缀,而不是默认使用的“custom”,这将减少DLL和其他版本的wx之间混淆的可能性。

虽然在你的情况下,可执行文件不是很大,但是如果你把所有的东西都静态地链接起来的话,它可能变得非常大 它也使用更多的内存,因为较大的可执行文件必须加载到内存中。

如果您要使用动态库,则操作系统可以在每个进程之间“共享”只读内存,从而降低内存需求。

使用动态库更新应用程序也更容易,而不必更新整个可执行文件,只需更换动态库(假设它的接口是相同的)就可以了! 如果用户想要更新其动态库(例如,通过包管理器),也是如此。