2009-01-19 85 views
5

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

在动态链接的项目上,链接库的相对/绝对位置很重要?

有什么优点和缺点?

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

回答

5

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

静态链接您的应用程序有一个好处,因为对链接代码的调用不会中断,因此它们运行得更快。这可能会对性能相关的代码产生影响。

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

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

+1

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

0

dll的一个明显的优点是你可以升级单个组件,而不仅仅是整个应用程序(理论上)并共享公共组件(通过将它们封装在dll中)。不幸的是,实际上dll(s)之间有一定的绑定(即使定义的很好)。这导致你需要在匹配的集合中升级dll,并隔离不能很好地运行在一起的dll。

如果不小心升级DLL,可能会导致称为DLL Hell的问题。

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

1

的DLL 可以能使用于较小运行时的工作集,如果应用程序写在这样一种方式来管理上下文的DLL之间的切换(例如,对于较大的应用程序,你可以划分应用功能集成到逻辑边界是在自包含的DLL中实现并允许加载程序在运行时加载)。

虽然DLLs主要安装/复制到.exe所在的文件夹中,但要求遵循加载程序加载规则(其中包括系统文件夹(坏主意),PATH,当前目录[请参阅LoadLibrary有关优先级的完整描述的API帮助文档])。

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

我更喜欢DLL,因为我的应用程序往往更大和更细化,这使我只能提供这些更新的组件(DLL)。我们甚至将业务逻辑从他们自己的DLL中分离出来[允许独立于逻辑的资源专用dll的本地化。

使用DLL进行编程是否会导致您强制自己遵守导出的类/方法或函数的契约。

+0

动态链接库可以用于导出库。请参阅LoadLibrary()/ LoadLibraryEx()。 – 2009-01-19 21:11:13