静态库 VS 动态库
如何得到库
①先写好一堆的.c文件(.c:我们所需要的各种工具函数)
②将这些.c编译为对应的.o
③将所有的这些.o打包为一个仓库文件(静态库或者动态库)
静态库:按照静态库的方式打包
动态库:按照动态库的方式打包
因为打包的规则不同,所以得到库也是不同的
共性与个性
二者的共性
都是事先做好的.o仓库。库这个东西很好,如果没有库这个东西的话,每次都要自己重复实现这些工具函数,这会非常的麻烦。eg:如果没有库提供printf的话,写个简单的helloworld,printf函数还需要自己实现,这就扯淡了。
二者的区别
这两种库的链接方式不同。
静态库:静态链接,由静态链接器(collect2/ld)来实现
动态库:动态链接,由动态链接器来实现
静态库
链接静态库 与 链接一般的.o没有区别
比如,如果printf函数是由静态库来提供的话,那就需要连接printf所在的静态库。静态库是.o的集合,printf在其中的某个.o中,链接静态库时,使用printf这个符号去搜索静态库中所有的.o,如果找到了printf所在的.o,将其链接到自己的程序中。
静态库缺点
链接静态库时,其实就是将库中.o的代码包含到自己的程序中,每个程序链接静态库后,都会包含一份独立的代码,当这些程序都运行起来时,所有这些重复的代码都需要占独立的存储空间,显然很浪费计算机资源。
很多人估计像我一样会有这样的疑问“假如有A.o和B.o, A.o包含了printf和scanf实现,还有其他很多函数的实现。我自己的代码中仅仅使用了printf,那么我链接静态库的时候是仅仅把printf代码包含进来还是把整个A.o代码包含进来。换句话说,静态链接的最小单位是.o还是单个函数?”
实际上只包含printf部分
动态库
主要是为了解决静态库的缺点而存在的。
链接动态库
在链接动态库时,collect2/ld不会将动态库中.o的代码直接静态链接(复制)到自己程序中,只会留下调用接口。程序运行时再去将动态库(链接)加载到内存中,然后就能调用动态库的函数(代码)了。
动态库的优点
不管多少程序使用了这个动态库,这些程序只会共享使用同一份的动态库,因此动态库也被称为共享库。
疑问:动态库的代码是被全部加载到内存中的吗?
是的,因为动态库并不知道你的程序需要使用哪个函数,所以整个动态库都会被加载到内存中。
动态库工作的过程
过程描述的不严谨,但是它的原理确实是这样的。程序运行起来后,“动态链接器”一看你想链接的是libc.so动态库,首先检查内存中有没有这个动态库。如果没有:到硬盘上找到libc.so库,将所有代码加载(动态链接)到内存中,并得到整个动态库在内存中的起始地址。如果有:说明之前有人已经加载过了,所以不再加载,直接得到动态库在内存中的起始地址即可。
举例:调用动态库的prinf函数
疑问:是怎么找到动态库中的printf函数的?
与调用普通的函数一样,就是通过地址跳转找到。
疑问:是怎么知道printf函数体的地址的?
printf的地址 = printf的相对地址 + 动态库加载时的地址
相对地址
编译时并不知道动态库会加载到什么位置,编译器其实并不知道printf函数第一条指令的绝对地址,所以编译时printf只是一个相对地址。
什么是相对地址?printf函数第一条指令相对于动态库头的距离。
绝对地址
动态链接器加载动态库后,会得到动态库在内存中的起始地址(绝对地址)。
printf相对地址 + 动态库绝对地址 == printf的绝对地址
如此就能调用到动态库中的printf函数。
静态库 与 动态库的名字尾缀
静态库名字尾缀
①windows:尾缀为.lib
②Linux:尾缀为.a
动态库名字尾缀
① windows:尾缀为.dll
②Linux:尾缀为.so
静态库 VS 动态库的更多相关文章
- C++ 系列:静态库与动态库
转载自http://www.cnblogs.com/skynet/p/3372855.html 这次分享的宗旨是——让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择 ...
- C++静态库与动态库
C++静态库与动态库 这次分享的宗旨是--让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择.这里不深入介绍静态库.动态库的底层格式,内存布局等,有兴趣的同学,推荐一 ...
- Linux下Gcc生成和使用静态库和动态库详解(转)
一.基本概念 1.1什么是库 在windows平台和linux平台下都大量存在着库. 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 由于windows和linux的平台不同( ...
- Makefile中静态库,动态库的创建和使用以及解压缩命令
应用层通过操作文件操控硬件 使用制作好的工具链: 刚开始学习时,用一些已经制作好的工具链,使用以下命令解压到gcc-3.4.5-glibc-2.3.6目录 cd /work/tools tar xjf ...
- VS中Debug和Realease、及静态库和动态库的区别整理(转)
原文出自:http://www.cnblogs.com/chensu/p/5632486.html 一.Debug和Realease区别产生的原因 Debug 通常称为调试版本,它包含调试信息,并且不 ...
- Linux下C++静态库、动态库的制作与使用
参考博文:C++静态库与动态库 >> 静态库 1. 静态库的制作 a) 编辑 name.cpp 和name.h文件 b) $g++ -c name.cpp //注意带参数-c,否则直接编译 ...
- 在Linux下如何使用GCC编译程序、简单生成 静态库及动态库
最近在编写的一个Apache kafka 的C/C++客户端,,在看他写的 example中,他的编译是用librdkafka++.a和librdkafka.a 静态库编译的,,,而我们这 ...
- VS中Debug和Realease、及静态库和动态库的区别整理
一.Debug和Realease区别产生的原因 Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序.Release 称为发布版本,它往往是进行了各种优化,使得程序在代码 ...
- Linux下Gcc生成和使用静态库和动态库详解
参考文章:http://blog.chinaunix.net/uid-23592843-id-223539.html 一.基本概念 1.1什么是库 在windows平台和linux平台下都大量存在着库 ...
- android开发 NDK 编译和使用静态库、动态库 (转)
在eclipse工程目录下建立一个jni的文件夹 在jni文件夹中建立Android.mk和Application.mk文件 Android.mk文件: Android提供的一种makefile文件, ...
随机推荐
- jqweui 正在加载样式的用法
见下图: 代码说明: $.showLoading("加载中..."); $.ajax({ success : function(data) { $.hideLoading(); } ...
- MySQL报错argument out of range 1055解决办法
参考:https://www.cnblogs.com/liangbenstudy/p/10246895.html MySQL 5.7.22查询时候报错 argument out of range 报错 ...
- stm32f405xx.h头文件的问题Undefined symbol IS_TIM_BREAK_INSTANCE
1. 在实际使用过程中发现,编译工程中,出了个错误Undefined symbol IS_TIM_BREAK_INSTANCE 经过查找,发现有两个stm32f405xx.h,其中一个是,安装的器件包 ...
- Visual Studio 2019 社区版本离线安装
官方指导 :https://docs.microsoft.com/en-us/visualstudio/install/create-an-offline-installation-of-visual ...
- python解析本地HTML文件
Python使用爬虫技术时,每运行一次,本地都会访问一次主机.为避免完成程序前调试时多次访问主机增加主机负荷,我们可以在编写程序前将网页源代码存在本地,调试时访问本地文件即可.现在我来分享一下爬取资料 ...
- 【转】mysql 存储过程的示例
原文地址:https://blog.csdn.net/lishaojun0115/article/details/50183661 begin #定义变量 declare local_sender v ...
- SPSS 2019年10月17日 21:46:38 今日学习总结
数据库: 开放数据库链接是为了解决异构数据库间的数据共享而产生的,现已成为WOSA的主要部分和基于Windows环境的一种数据库访问接口标准ODBC为异构数据库访问提供一个接口,允许应用程序以SQL为 ...
- Linux-通过源码安装某个版本的内核
一下操作步骤来自于各种搜索出来的杂七杂八的东西.主要来自:https://blog.csdn.net/happyfreeangel/article/details/85088706 前置环境:Cent ...
- SORRY_FOR_MY_LIFE
人生最大的痛苦不在于真正的痛苦, 而是没有确切的人生方向, 我们总是想的很多, 但是最后才发现, 我们一直拿自己的弱点与别人的长处竞争, 因为,我们总是得不到自己想要的, 但是最多的是对于没有目标的人 ...
- linux中matlab的中文乱码问题
ref:http://hi.baidu.com/36470902/item/47f3b133c419d989f5e4ade1 将系统的jre拷贝到matlab去 . sudo mv $MATLAB/s ...