将应用程序部署为静态或动态构建的最佳实践是什么?
What is best practice for deploying an application as static or as dynamic build?
我打算发布和部署一个用 C++ 和 wxWidgets 编写的应用程序。 wxWidgets-library 可以作为 dll 和静态库使用。因此,我可以选择将应用程序部署为动态构建应用程序或静态构建应用程序。
目前,我更喜欢静态构建选项,因为:
- 可执行文件不是太大(< 20 兆字节)。
- 没有需要考虑的依赖项。
- 无需安装。
问题
我是不是漏掉了什么很重要的东西?
虽然在您的情况下可执行文件不是很大,但如果您 link 静态地执行所有内容,它可能会变得非常大。它还使用更多内存,因为必须将更大的可执行文件加载到内存中。
如果您要使用动态库,操作系统可以"share"每个进程之间的只读内存,从而降低您的内存需求。
使用动态库也可以更轻松地更新您的应用程序,因为不必更新整个可执行文件,您只需更换动态库(假设其接口相同),瞧!如果用户想要更新他们的动态库(例如,通过包管理器),这同样适用。
我的建议是静态链接。我的两分钱优势:
- 您不依赖于客户端站点上安装的 WX 工具集,也不需要将其与安装程序捆绑在一起,也不需要作为 先决条件 的独立安装程序。
- 您不期望或要求客户进行 WX 安装(甚至
XCOPY
部署)。客户不会打扰!
- 20MB 在 TB 的世界和良好的 MB 互联网速度中是相当小的。
- 如果客户碰巧使用 higher/lower 版本的库,您不会从客户那里收到意外的行为错误。
- 您可以确信应用程序将按照您在环境中测试的方式(大部分)运行
- 您可以继续使用 WX 的 X 版本,即使 buggy/flashy X+1 版本出来了。您不想让客户拥有 "newer and refined" 版本的库,这会破坏您的应用!
如果有充分的理由使用动态链接,则应使用动态链接,否则应使用静态链接。使用动态链接的一些很好的理由是:
- 您正在为一个系统分发二进制文件,该系统已经有或可能有 wxWidgets 库,例如许多 Linux 发行版、OS X(使用 Homebrew)等。在这种情况下强烈推荐重用现有系统库而不是使用您自己的系统库。
- 您有几个使用 wxWidgets 的模块:space 使用动态链接的节省在这里可能非常重要。
- 您在 MSW 下使用 DLL 中的 wxWidgets:在这种情况下,wxWidgets 本身也应该作为 DLL 链接,否则如果将多个 wxWidgets 实例加载到进程地址中,您可能会遇到问题 space .
- 您计划通过网络更新应用程序的安装:在这种情况下,能够只更新单个 DLL 而不是整个单体应用程序可能会更好。
如果这些原因都不适用,例如你只想在 MSW 下分发一个程序,静态链接更简单,更可取。
相关说明:如果您最终分发了 wxWidgets DLL,请考虑为它们使用唯一的后缀而不是默认使用的 "custom",这将减少您的 DLL 与其他版本混淆的可能性wx.
我打算发布和部署一个用 C++ 和 wxWidgets 编写的应用程序。 wxWidgets-library 可以作为 dll 和静态库使用。因此,我可以选择将应用程序部署为动态构建应用程序或静态构建应用程序。
目前,我更喜欢静态构建选项,因为:
- 可执行文件不是太大(< 20 兆字节)。
- 没有需要考虑的依赖项。
- 无需安装。
问题
我是不是漏掉了什么很重要的东西?
虽然在您的情况下可执行文件不是很大,但如果您 link 静态地执行所有内容,它可能会变得非常大。它还使用更多内存,因为必须将更大的可执行文件加载到内存中。
如果您要使用动态库,操作系统可以"share"每个进程之间的只读内存,从而降低您的内存需求。
使用动态库也可以更轻松地更新您的应用程序,因为不必更新整个可执行文件,您只需更换动态库(假设其接口相同),瞧!如果用户想要更新他们的动态库(例如,通过包管理器),这同样适用。
我的建议是静态链接。我的两分钱优势:
- 您不依赖于客户端站点上安装的 WX 工具集,也不需要将其与安装程序捆绑在一起,也不需要作为 先决条件 的独立安装程序。
- 您不期望或要求客户进行 WX 安装(甚至
XCOPY
部署)。客户不会打扰! - 20MB 在 TB 的世界和良好的 MB 互联网速度中是相当小的。
- 如果客户碰巧使用 higher/lower 版本的库,您不会从客户那里收到意外的行为错误。
- 您可以确信应用程序将按照您在环境中测试的方式(大部分)运行
- 您可以继续使用 WX 的 X 版本,即使 buggy/flashy X+1 版本出来了。您不想让客户拥有 "newer and refined" 版本的库,这会破坏您的应用!
如果有充分的理由使用动态链接,则应使用动态链接,否则应使用静态链接。使用动态链接的一些很好的理由是:
- 您正在为一个系统分发二进制文件,该系统已经有或可能有 wxWidgets 库,例如许多 Linux 发行版、OS X(使用 Homebrew)等。在这种情况下强烈推荐重用现有系统库而不是使用您自己的系统库。
- 您有几个使用 wxWidgets 的模块:space 使用动态链接的节省在这里可能非常重要。
- 您在 MSW 下使用 DLL 中的 wxWidgets:在这种情况下,wxWidgets 本身也应该作为 DLL 链接,否则如果将多个 wxWidgets 实例加载到进程地址中,您可能会遇到问题 space .
- 您计划通过网络更新应用程序的安装:在这种情况下,能够只更新单个 DLL 而不是整个单体应用程序可能会更好。
如果这些原因都不适用,例如你只想在 MSW 下分发一个程序,静态链接更简单,更可取。
相关说明:如果您最终分发了 wxWidgets DLL,请考虑为它们使用唯一的后缀而不是默认使用的 "custom",这将减少您的 DLL 与其他版本混淆的可能性wx.