为什么要创建DLL而不是将所有内容编译成一个大的可执行文件?

Ars*_*nko 10 optimization performance dynamic-linking

我看到并完成了许多小型产品,其中同一块软件被分成一个可执行文件和几个DLL,这些DLL不仅仅是由其他人完成的共享库,而是专门为这个软件完成的库,由同一个开发团队.(我不是在这里谈论大规模的产品,只需要数百个DLL并与其他产品广泛分享.)

据我所知,从开发人员的角度来看,将代码分成几个部分,每个部分都编译成一个单独的DLL .这意味着:

  • 如果开发人员更改了一个项目,他必须只重新编译这个项目,而依赖项目可以更快.
  • 项目可以由团队中的单个开发人员完成,而其他开发人员只需使用提供的接口,而无需插入代码.
  • 软件的自动更新有时可能更快,服务器影响更小.

但最终用户呢?当一切都可以组合在一起时,提供一个由一个EXE和几个DLL组成的软件并不是一件坏事吗?毕竟:

  • 用户可能甚至不了解这些文件是什么以及为什么他们在硬盘上填充内存,
  • 用户可能想要移动程序,例如将其保存在USB闪存驱动器上.拥有一个大的可执行文件可以简化
  • 大多数防病毒软件都会检查每个DLL.检查一个可执行文件将比较小的可执行文件和几十个库快得多.
  • 使用DLL会使某些事情变得更慢(例如,在.NET Framework中,必须找到并检查"好"库是否已签名),
  • 如果DLL被删除或被错误的版本替换会发生什么?每个程序都处理这个吗?或者它甚至没有解释它有什么问题就崩溃了?
  • 有一个大的可执行文件有一些其他的优势.

所以是不是但从最终用户的角度更好,对于小/中等规模的方案,以提供一个大的可执行文件?如果是这样,为什么没有工具允许轻松实现(例如,集成在通用IDE中的魔术工具将整个解决方案编译成一个可执行文件,当然不是每次,但是按需或在部署期间).


这有点类似于将所有CSS或所有JavaScript文件放入用户的一个大文件中.拥有多个文件对于开发人员而言更加智能,并且更易于维护,但将网站的每个页面链接到两个文件而不是几十个文件可以优化性能.以同样的方式,CSS精灵对于设计师来说是可怕的,因为它们需要更多的工作,但从用户的角度来看更好.

pet*_*hen 8

这是一个权衡
(你自己已经知道了;))
对于大多数项目,客户并不关心安装了多少文件,但他关心有多少功能及时完成.让开发人员的生活更轻松也有利于用户.

DLL的更多原因

有些库在同一版本中不能很好地协同工作,但可以在DLL中运行(例如,一个DLL可能使用WTL3,另一个需要WTL8).

一些DLL可能包含要加载到其他可执行文件中的组件(全局钩子,shell扩展,浏览器插件).

某些DLL可能是第三方,仅作为DLL提供.

公司内部可能会重复使用 - 即使您只看到一个"公共"产品,也可能在使用该DLL的十几个内部项目中使用它.

某些DLL可能是使用不适用于公司所有开发人员的不同环境构建的.

独立EXE与已安装产品
无论如何,许多产品无法作为独立可执行文件运行.它们需要安装,用户不要接触他不应该触摸的东西.拥有一个或多个二进制文件并不重要.

构建时间影响
可能您低估了构建时间的影响,并为大型项目维护稳定的构建.如果构建需要甚至5分钟,你可以用化学方式称"让开发人员提前思考,而不是修补,直到看起来工作正常".但这是一个严肃的时间,并造成严重的分心.

单个项目的构建时间很难改善.在VC9上工作,在一个项目中构建并行化是不稳定的,增量链接器也是如此.链接时间特别难以通过更快的机器"优化".

开发者独立
另一件你可能会低估的事情.
要使用DLL,您需要.dll和.h.要编译和链接源代码,通常需要设置包含目录,输出目录,安装第三方库等.真的很痛苦.