静态库和动态库有什么区别?老男孩Linux运维培训
老男孩IT教育
行业新闻
2021年8月4日 17:27
在Linux中,我们编写代码的时候经常用到已有的接口,它们是通过库的形式来提供给我们使用的,常见形式有两种,一种是以.a为后缀,这也就是静态库;另一种则以.so为后缀,这也就是动态库,那么同为库,这两者的区别在哪呢?我们又该如何使用如何选择呢?请看下文:
在Linux中,我们编写代码的时候经常用到已有的接口,它们是通过库的形式来提供给我们使用的,常见形式有两种,一种是以.a为后缀,这也就是静态库;另一种则以.so为后缀,这也就是动态库,那么同为库,这两者的区别在哪呢?我们又该如何使用如何选择呢?请看下文:
首先我们需要了解下什么是目标文件,目标文件常按特定格式来组织,在Linux下,是ELF格式,即可执行可链接格式,在Windows操作系统下,则是PE格式,即可移植可执行。
通常目标文件有三种形式:
1、可执行目标文件:也就是我们通常所说的,可以直接运行的二进制文件。
2、可重定位目标文件:包含了二进制的代码和数据,可以与其他可重定位目标文件合并,并创建一个可执行目标文件。
3、共享目标文件:是一种在加载或运行时进行链接的特殊可重定位目标文件。
静态库是什么?可冲定位目标文件以一种特定的方式打包成一个单独的文件,并且在链接生成可执行文件时,从这个单独的文件中拷贝自己需要的内容到最终的可执行文件中,这个单独的文件,被称为静态库,Linux中通常以.a(archive)为后缀。
动态库是什么?动态库可静态库类似,但是它并不在链接时将需要的二进制代码都拷贝到可执行文件中,而是仅仅拷贝一些重定位和符号表信息,这些信息可以在程序运行时完成真正的链接过程,Linux中通常以.so(shared object)作为后缀。
有什么区别呢?
1、可执行文件大小不一样:静态链接的可执行文件比动态链接的可执行文件要大得多,因为它将需要用到的代码从二进制文件中拷贝了一份,而动态库仅仅是复制了一些重定位和符号表信息。
2、占用磁盘大小不一样:如果有多个可执行文件,那静态库中的同一个函数的代码就会被复制多份,而动态库只有一份,因此使用静态库占用的磁盘空间相比动态库要大。
3、扩展性与兼容性不一样:如果静态库中某个函数的实现变了,那么可执行文件必须重新编译,而对于动态链接生成的可执行文件,只需要更新动态库本身即可,不需要重新编译可执行文件。
关于“静态库和动态库有什么区别”介绍到这里就结束了,作为IT教育人才服务平台,老男孩教育一直专注于Linux运维人才的输出服务,有效引导了学员的前进方向,让他们少走弯路,帮助更多人了解Linux技术。想深入的学习Linux云计算运维的知识,可以关注下老男孩教育。
推荐阅读:
