静态链接的优点

11

我最近在这里读到了一个与静态链接和动态链接有关的问题,这让我想起了一些自己的疑问。从那篇帖子中,我可以看出它们之间的技术区别(包括直接包含目标文件内容而不仅是指向它),但我想更多地了解一下这样做的优缺点。

一段时间以前,一个编程多年的朋友抱怨说C#没有静态链接,他表示这是他期待未来版本最想要的功能。不幸的是,我只是个新手,不太理解这个说法。

非常感谢您的解答!

5个回答

10
静态链接的优点在于它消除了对库的外部依赖 - 也就是说,您使用的库的行为永远不会因为某个人更改了磁盘上的库而改变。这也是静态链接的缺点之一;如果操作系统发生更改,并且需要新版本的库才能正常工作,您必须提供升级版二进制文件。同样,如果库中添加了错误修复程序,则如果您已经进行了静态链接,则不会自动获取该错误修复程序。
大多数(实际上,现今可能全部)操作系统可以为多个进程加载动态库的一个副本,这就是为什么在 UNIX 上它们被称为共享对象的原因。

7
一个静态可执行文件包含所有需要的对象,因此在执行时不会调用任何外部DLL。优点是它可以跨越许多平台移植,无论该系统安装了哪个版本的DLL。但缺点是你可能会浪费磁盘空间,因为你正在将已经存在于系统/外部DLL中的代码包含在可执行文件中。此外,我认为,但我不太确定,DLL只加载一次主内存,无论有多少可执行文件使用它们,但如果你在可执行文件中链接库对象,则会加载相同的代码两次(一次用于其他程序使用的DLL,一次用于你的可执行文件)。另一方面,这可能是一个优点而不是一个缺点,因为可执行文件仅包含其所需的外部库的对象,而不是整个库。当应用程序需要时,DLL作为整体加载到内存中。
静态链接对于编译要从一个系统携带到另一个系统的小型应用程序非常理想。例如,当tcpdump没有包含在每个Linux发行版中时,拥有静态编译版本真的很有用。它绑定在每个Linux上工作,无论它安装了哪个版本的内核,glibc或其他系统库。也许在Windows世界中没有那么多意义,因为平台更加同质化。如果为Windows XP / NET vX.X编译,则它将在许多计算机上工作。如果为Debian X.X编译,则肯定不适用于旧版/新版的Debian或其他发行版,如Redhat。
这个线程也可以解决你的问题。

6
我不确定在C#中静态链接是否真的是一个好主意,有太多原因。其中之一是,与像C或C++这样的语言不同,C#具有程序集的概念,它们基本上是可执行文件或DLL。
现在,如果你想在.NET中静态链接东西,你要么
- 将来自多个程序集的类合并为单个程序集。这会破坏很多东西,比如“internal”访问修饰符。 - 在同一个可执行文件中有多个程序集。这将使整个程序集的概念变得无用,并需要重新设计.NET Framework中反射的方法。
我相信肯定有巧妙的方法可以避免这些问题,但我并不认为在像.NET或Java这样的托管环境中进行静态链接是有意义的。我的意思是,静态链接确实提高了性能,但并不是那么显著。而且我们也不使用托管语言来获得执行速度。
另一个问题是DLL地狱,但在.NET中,这个问题已经被解决了。

29
希望只有一个.exe 文件而不是一个.exe 文件和 30 个.dll 文件是完全可以的理由 - 我的客户不应该因为我想将软件重构为多个项目而不得不携带 30 多个文件。我不明白为什么你说的任何东西都必须是这样 - 基本上它们可以将 .dll 存储在 .exe 中,并在需要时像加载 .dll 一样加载它。没有什么好的理由不支持静态链接。 - BlueRaja - Danny Pflughoeft
这里有一个解决方法,只需确保资源名称指向您的实际程序集:http://blogs.msdn.com/b/microsoft_press/archive/2010/02/03/jeffrey-richter-excerpt-2-from-clr-via-c-third-edition.aspx - Kaganar

3
所有必需的内容都打包到一个可执行文件中。因此,
  • 您不需要安装其他任何东西。只需复制并运行,或在其所在位置运行。没有安装程序、没有警告,也没有由于错误的 DLL 版本而产生的奇怪错误。就这样。
  • 此外,用户也可以享受这种简单性。这通常更加重要。没有人喜欢安装依赖项。特别是如果它像 .NET 框架一样庞大。

当然,可执行文件的大小会增加,但它应该比一堆无聊的图形文件小。


1
那些认为以依赖地狱为代价来最小化磁盘空间的人,他们的优先事项是错误的。 - Sridhar Sarnobat
1
@sridhar-sarnobat 是的 - StayOnTarget

1

静态连接与动态连接之间的差异有一个很好的例子。如果你查看InkScape项目,你会发现InkscapePortable和InkScape两个版本。InkscapePortable可以从USB存储器上运行,但是InkScape则不行。


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