静态/动态运行时链接

时间:2009-01-19 01:51:54

标签: c++ windows linker

在VC ++中选择链接方法的最佳做法是什么?任何/一切都可以静态链接吗?

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

有什么利弊?

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

3 个答案:

答案 0 :(得分:5)

动态链接允许您升级单个DLL而无需重新编译应用程序。这就是为什么可以在不重新编译应用程序的情况下升级Windows的原因,因为动态链接器能够确定dll中的入口点,前提是方法名称存在。

静态链接您的应用程序有一个好处,即对链接代码的调用不是间接的,因此它们运行得更快。这可能会对极其依赖性能的代码产生影响。

使用DLL还可以帮助您减少内存占用,因为有效地您只需要根据需要加载库,并且可以在完成后卸载它们(想想应用程序插件,只有在打开图像时才加载图像浏览库)等)

编辑:Robert Gamble添加了一条我错过的评论:DLL被加载到操作系统中所有进程共享的内存中。这意味着如果两个程序(或程序的两个实例)使用相同的DLL,它们将使用加载到内存中的相同DLL,这将进一步减少总体内存使用量。

答案 1 :(得分:1)

如果应用程序是以管理DLL之间的上下文切换的方式编写的,那么

DLL 可以制作更小的运行时工作集(例如,对于大型应用程序,您可以将应用程序功能划分为在自包含的DLL中实现的逻辑边界,并允许加载器在运行时加载。)

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

您“添加了”有关LIB文件的评论。在BOTH Dynamic和Static中,您使用LIB文件进行链接。但是在动态加载的情况下,您将传递.exe以及所有相关的DLL(LIB文件包含相应DLL的导出入口点)。

我更喜欢DLL,因为我的应用程序往往更大和分段,这使我只能提供那些更新的组件(DLL)。我们甚至将业务逻辑与它们自己的DLL中的表示分开[允许独立于逻辑的仅资源dll的本地化。

使用DLL编程会导致您强迫自己遵守导出的类/方法或函数的约定。

答案 2 :(得分:0)

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

如果没有仔细升级DLL,可能会导致DLL Hell的问题。

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