静态库与动态库
-
什么是库
- 库文件是计算机上的一种文件,可以把库文件看成一种代码仓库,它提供给使用者一些可以直接拿来用的变量,函数或类
- 库是一种特殊的程序,但是库不能单独运行
- 库文件有两种,静态库和动态库,区别是:静态库在程序的链接阶段被复制到了程序中;动态库在链接阶段没有被复制到程序中,而是程序在运行时由系统动态加载到内存中供程序调用
- 库的好处:
- 代码保密
- 方便部署和分发
-
静态库的制作
-
命名规则:
-
Linux: libxxx.a
lib :前缀(固定)xxx:库的名字,自己起
.a:后缀(固定) -
Windows:libxxx.lib
-
-
制作:
-
gcc -c获得源文件的.o文件
-
将用到的.o文件打包,使用ar工具
ar rcs libxxx.a xxx.o xxx.o
r -将文件插入备存文件中
c -建立备存文件s -索引
-
-
工作原理:
GCC 进行链接时,会把静态库中代码打包到可执行程序中,最后直接运行可执行程序即可 -
使用:
note
:- 使用库的时候,我们把封装好的库给别人,同时也要将库所依赖的头文件给别人,因为别人只拿到库文件的话,不知道这个库里面有什么东西,只有 通过头文件里的函数声明,别人知道有那些函数,才能够去使用
- 我们在用
gcc -l
命令查找库文件的时候,注意指定的是libxxx.a
中的xxx
,因为libxxx.a
是动态库文件的名称,xxx
才是动态库的名称
-
-
动态库的制作
-
命名规则:
-
Linux: libxxx.so
lib: 前缀(固定)
xxx:库的名字,自己起
.so:后缀(固定)
在Linux下是一个可执行文件 -
Windows: libxxx.dll
-
-
制作:
- gcc -c获得源文件的.o文件,与静态库制作不同的是,这一步要用
gcc -c -fpic/-FPIC a.c b.c
来得到和位置无关的代码 - gcc得到动态库
gcc -shared a.o b.o -o libcakc.so
- gcc -c获得源文件的.o文件,与静态库制作不同的是,这一步要用
-
工作原理:
GCC进行链接时,动态库的代码不会被打包到可执行程序中,程序运行起来之后,当用到库中的api时,它会由动态载入器去以下列表中DT_RPATH段---->环境变量LD_LIBRARY_PATH--->etc/ld.so.cache文件列表----> /lib/,user/lib
寻找库的绝对路径,找到库文件之后,再将其载入内存 -
使用
动态库与静态库的编译过程是一样的,但是在运行最后的可执行文件时,静态库直接运行就行,但是动态库不可以。因为编译的时候只是把动态库的一些可执行信息放到可执行程序中,并不会加载动态库的内容到内存中,所以编译阶段不会报错,但是运行的时候用到了动态库的内容,就需要把动态库加载到内存中。如何向配置文件里面加入动态库绝对路径
-
cd 进入home目录下
-
找到
.bashrc
,并配置这个文件 -
shif+g
跳到最后一行
o
往下插入一行
输入以下命令,:
后面的内容根据自己的库的绝对路径来填写
:wq
保存并退出 -
使文件生效(箭头的两种方式都行)
-
-
-
最后贴几张图回顾一下
- 静态库与动态库的优缺点
note
:为什么更新麻烦:因为每次更新了库,都需要重新编译链接文件
为什么发布程序无需提供静态库:因为静态库在链接的时候已经在程序里了
note
:为什么更新简单:因为只需要更新库就好了,不需要重新编译整个程序,库是在运行时动态加入内存的
所以发布程序时需要提供依赖的动态库,不然用户没法使用
整理自牛客网Linxu系统编程课程列表_牛客网 (nowcoder.com)