Linux下浅谈静态库和动态库

Linux下浅谈静态库和动态库


上周学习了关于Linux下静态库和动态库制作的相关知识,这个知识点在Linux中算是一个比较重要的知识点了,现在写这篇博客就算是做一个笔记了。

说到静态库和动态库不得不说的就是程序代码编译链接过程了。可以说程序代码编译链接是很值得也很有必要我们去关注了解的了。
首先我们应该知道什么是库
说到库那么什么是库呢?库从本质上来说就是一种可执行代码的二进制形式,可以被操作系统载入内存中执行。 
所谓库就是一些功能代码经过编译链接的可执行形式。 
我们通常使用的库就是库就是别人写好的,现有的、可以用的、成熟的代码,在我们开发的过程中只用引入文件链接到我们的程序中即可。 
在说链接的时候,链接的主要内容就是把各个模块之间相互引用的部分处理好,使得各个模块之间可以正确的衔接。而链接也是有两种的链接形式:静态链接与动态链接。


C文件在Linux的编译过程一般分为四个步骤:
使用gcc编译程序时,编译工程分为4个阶段

(1)预处理:源文件到预处理文件
(2)编译:预处理文件到汇编文件
(3)汇编:汇编文件到可重定向的目标文件
(4)链接:可重定向的目标文件到可执行的目标文件



linux下库分为两种:静态库和动态库。 

静态库: 

静态库的命名方式是“libxxx.a”,库名前面加lib,后缀为.a,xxx为静态库名。 
链接时间:静态库的代码是在编译的过程中被载入到程序中。 
链接方式:静态库的链接是将整个函数库的所有数据都整合进了目标代码。优点就是编译后的执行程序不需要外部的函数库的支持(所用的函数已经被编进去了),缺点就是所使用的静态库发生更新改变,程序必须重新编译。 



动态库: 
动态库的命名方式与静态库相似,前缀相同为“lib”,后缀为“.so”。 
链接时间:动态库在编译的时候并没有被编译进目标代码,而是当你的程序执行到相关函数的时候才调用函数库里相关的函数。 
优点:动态库的改变不影响你的程序,动态函数库升级比较方便。 
缺点:函数库没有整合进程序,程序的运行环境必须提供相应的库。 
不同点: 
当一个程序分别使用动态库和静态库两种方式生成两个可执行文件时候,静态链接生成的文件所占用的内存要比动态链接生成的文件所占用的内存要大。(静态链接在编译的时候把所有的函数都编译进了程序,动态链接在运行的时候才调用库里的函数) 


静态库的创建实例


首先先来了解一下常用的命令与选项
ar命令:用来维护链接编辑库所使用的库索引,ar命令将一个或多个指定的文件并入单个并写成ar压缩文档格式的压缩文档文件。当ar命令创建库的时候,可以创建可传输格式的报头,当创建和更新库的时候会重建符号表。 
常用的选项: 
-c:创建一个库,不管这个库存不存在,都将创建。 
-r:在库中插入模块(替换)。若插入的模块在库中存在,则会进行替换。 
-s:创建目标文件索引,在创建较大的库时能加快时间。不困是否修改了库内容,都将重新符号表。 
-t:将库目录写到标准输出,如果指定文件名称,则显示指定的文件。如果不指定文件名称的话,则显示库目录的所有文件。 
-v:将建立新库的详细的文件逐个写到标准输出 


制作实例如下:

(1)先准备两个库源码文件test1.c 和test2.cLinux下浅谈静态库和动态库


(2)静态库libmytest.a已经生成,用file命令查看其属性,发现它确实是归档压缩文件 Linux下浅谈静态库和动态库

即静态库创建成功



动态库创建实例
(1)首先我们分别创建了三个源码文件test3.c test4.c和test.h

Linux下浅谈静态库和动态库


(2)动态库创建成功


Linux下浅谈静态库和动态库


未完待续...