静态/动态运行时链接

6

如何在VC++中选择链接方法的最佳实践是什么?任何/所有东西都可以静态链接吗?

在动态链接项目中,链接库的相对/绝对位置是否重要?

优缺点是什么?

添加:我主要是指lib文件。它们的行为与dll链接相同吗?

3个回答

6
动态链接允许您升级单个DLL而无需重新编译应用程序。这就是为什么Windows可以升级而不必重新编译应用程序的原因,因为动态链接器能够确定DLL中的入口点,前提是方法名称存在。
静态链接应用程序的好处在于对链接代码的调用不是间接的,因此运行速度更快。这可能会对极端依赖性能的代码产生影响。
使用DLL还可以帮助您减少内存占用,因为实际上只有在需要时才加载库,并且可以在完成后卸载它们(例如应用程序插件,只有在打开图像时才加载图像浏览库等)。
编辑:Robert Gamble添加了我错过的评论:DLL加载到操作系统中所有进程共享的内存中。这意味着如果两个程序(或您程序的两个实例)使用相同的DLL,则它们将使用加载到内存中的相同DLL,这将进一步减少总体内存使用量。

1
+1,好答案。此外,在处理多个应用程序使用的库时,如果使用动态库,则不需要为每个程序加载完整的库副本,库中的可执行代码可以在所有使用它的程序之间共享,从而进一步减少内存使用。 - Robert Gamble

1

DLL(动态链接库)可以使运行时工作集更小,如果应用程序以这样的方式编写,以管理 DLL 之间的上下文切换(例如,对于较大的应用程序,您可以将应用程序功能划分为逻辑边界,以在自包含的 DLL 中实现,并允许加载器在运行时加载)。

虽然 DLL 主要是安装/复制到与 .exe 相同的文件夹中,但要求遵守加载器的加载规则(其中包括系统文件夹(不好的想法),PATH,当前目录[请参阅 LoadLibrary API 帮助文档以获取完整的优先级描述])。

您“添加”了有关 LIB 文件的评论。在动态和静态两种情况下,都使用 LIB 文件进行链接。但在动态加载的情况下,您需要将 .exe 与所有依赖的 DLL 一起交付(LIB 文件包含相应 DLL 的导出入口点)。

我喜欢使用 DLL,因为我的应用程序往往比较大且分段,这使我能够仅交付那些更新的组件(DLL)。我们甚至将业务逻辑与演示分开放在自己的 DLL 中[允许资源仅 DLL 的本地化独立于逻辑]。

使用 DLL 进行编程会迫使您遵守导出类/方法或函数的契约。


DLL可以在没有导入库的情况下使用。请参阅LoadLibrary()/LoadLibraryEx()。 - Rob K
由于问题明确要求最佳的“链接方法”,因此我坚持了这个背景。LoadLibrary(EX)在运行时执行,以使加载程序将DLL定位/加载到进程内存中,然后返回导出函数的函数指针供应用程序使用。 - SAMills

0

使用dll的明显优势是可以升级单个组件而不仅仅是整个应用程序(理论上),并共享公共组件(通过将它们封装在dll中)。不幸的是,在实践中,即使定义良好,dll之间也存在一定程度的绑定。这导致您需要升级匹配集中的dll,并隔离不兼容的dll。

如果没有小心地进行DLL升级,可能会导致所谓的DLL Hell问题。

在现实生活中,应用程序倾向于将其使用的所有dll放在可执行文件的同一目录中。这样可以进行升级,但不利于共享。然后,升级包括与Windows中央存储库中的DLL同步升级应用程序目录中的DLL集。


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