C/C++静态与动态库示例

Fra*_*lea 3 c c++ static dynamic

我正在学习静态和动态库.到目前为止,我理解为什么我需要一个动态库.如果有什么东西在变化,最好插入一个新版本,所有的应用程序都会自动更新,甚至没有注意到.

a)非常适合插件,b)使用相同库的多个应用程序和c)需要纠正错误时的维护.

但是,为什么有人会使用静态库?我的意思是什么是优势?某人有一个例子,所以我能更好地理解它吗?是否使产品成为专有产品?

编辑:由于评论中的混乱.我理解静态库是什么,我也知道动态库之间的区别.除了我之外,为什么有人会使用静态库而不仅仅是源本身.我想我现在开始明白静态库具有以下优点:

a)更好的代码维护b)更快的编译时间

dav*_*vka 7

静态和动态库之间还有另一个区别,在某些情况下可能会变得很重要,我很惊讶没有人提到这一点.

  • 当链接静态库时,符号(例如函数名称)在链接(编译)时间内解析,因此对库函数的调用被解析为直接调用最终可执行文件中的地址.

  • 使用动态库时,这会在运行时发生,此时库被加载到进程空间(通常在进程启动期间).必须将符号映射到进程的地址空间.根据符号的数量(可能非常大)和启动时加载的库的数量,延迟可能非常明显.

关于Linux上的动态库有如此优秀的深入指南 - 如何编写共享库.这对我们大多数人来说太详细了,但即使浏览它也会给你很多惊人的见解.例如,它说在OpenOffice的1.0版本中,它必须在发布期间进行超过150万次字符串比较!

得到的是一种感觉,一种方法是设置LD_DEBUG符号,和LD_DEBUG_OUTPUT一些文件,运行程序,并期待在文件中看到,在启动时的活动.


spe*_*ane 5

编译器可以使用动态库无法执行的静态库执行各种其他优化.例如,编译器可以从静态库中删除未使用的函数.它不会在动态库中知道这样做.但是还有更高级的优化.编译器可以将代码从静态库函数拉入主程序,这将消除函数调用.非常聪明的编译器可以做得更多.天空真的是静态库的限制,但动态库使得这一点变得更加困难或不可能.

然而,更实际的原因可能是静态链接是大多数库编译器的默认设置,因此很多人最终都会使用它.要创建动态库,通常需要创建一个公开某些功能的附加文件.虽然文件往往比较简单,但如果你没有花时间去做,那么你的库最终都是静态的.

正如另一篇文章中所提到的,管理与静态库的依赖关系往往更容易,因为你拥有一切在你控制之下.您可能不知道用户系统上安装了什么dll/so.