Linux下的“库”和“链接”
库
1.库是计算机上的一类文件,可以简单地把库当作代码仓库,提供给使用者一些可以直接使用的变量、函数或者类。
2.库是一种特殊的一种程序,编写库的程序和编写普通程序的差别不大,只是库不能单独运行。
3.库分为:静态库和动态库。区别在于静态库在程序的链接阶段被复制到程序中,动态库则没有被复制,而是在程序每次运行的时候由系统动态加载到内存中供程序使用
库的好处
- 库里面的代码比较保密,不容易被看到
- 方便程序的部署和分发
静态库
命名规则
1.在Linux下,静态库一般写为:libxxx.a
lib:前缀,是固定的,每个静态库都有;xxx:静态库的名称;.a:固定后缀)
2.在Window下,静态库一般为:libxxx.lib,与上面的相比,只有后缀是不同的
静态库的制作
- 首先需要将写好的程序编译成.o文件,也就是上图中倒数第二步形成的文件
- 使用ar工具,将.o文件打包
1
2
3g++/gcc -c xxx -o xxx.o
ar rcs libxxx.a xxx.o
(r:将文件插入备存文件中 c:建立备存文件 s:索引)
静态库的使用
1 | g++/gcc xxx -o xxx.out -L 库的路径 -l 库的名称(libxxx.a中的xxx就是库的名称) [-I 头文件的路径](在同个目录下就不需要这一项) |
做个简单的测试
head.h
1 |
|
add.cpp
1 |
|
sub.cpp
1 |
|
main.cpp
1 |
|
1.将add.cpp 和sub.cpp 封装成静态库
1 | g++ -c add.cpp -o add.o |
2.将main.cpp编译成可执行文件(此时main.cpp里面使用到了add.cpp和sub.cpp,所以需要用到libadd.a和libsub.a)
1 | g++ main.cpp -o main.out -L ./ -l add -l sub -I ./ |
动态库
命名规则
- 在Linux下,动态库一般为libxxx.so,除了后缀不同,其他是一样的
- 在Window下,一般为libxxx.dll
动态库的制作
gcc得到.o文件,与静态库不同的是,这个过程需要得到的是与位置无关的代码
1 | gcc/g++ -c -fpic/-fPIC a.c b.c -o a.o b.o |
gcc得到动态库
1 | gcc/g++ -shared a.o b.o -o libxxx.so |
动态库的使用
1 | g++/gcc xxx -o xxx.out -L 库的路径 -l 库的名称(libxxx.so中的xxx就是库的名称) [-I 头文件的路径](在同个目录下就不需要这一项) |
与静态库不同的是,想要使用动态库,就必须配置环境变量!
如何配置环境变量?
方法一:临时添加
1 | 在终端输入: |
方法二:永久添加
1 | 在home目录下,打开.bashrc文件,在最后一行添加: |
可以用(ldd 可执行文件名)命令查看可执行文件名的依赖关系,需要在可执行文件的目录下使用
动态库与静态库的对比
程序编译成可执行文件的过程
共同点:都是在链接阶段与目标代码等链接成可执行文件
不同点:静态库在链接阶段的时候,会把库中的代码打包到可执行文件中,相当于把库中的代码复制到可执行文件中;动态库则是当可执行文件代码运行到含动态库代码时,加载动态库。
创建过程
创建方法不同,具体看上面
库的使用
使用命令是一样的,但是动态库使用前需要预先设置环境变量
静态库的优缺点
优点
a. 静态库链接时打包到可执行程序中的加载速度较快
b. 发布程序时不需要提供静态库,移植方便
缺点
a. 消耗系统资源,浪费内存
b. 更新,部署,发布程序时较麻烦
动态库的优缺点
优点
a. 可以实现进程间资源共享(共享库)
b. 更新,部署,发布程序时简单
c. 可以控制何时加载动态库
缺点
a. 加载速度比静态库慢
b. 发布程序时需要提供依赖的动态库
链接
链接分为:软链接和硬链接
软链接
解释
软链接又叫做“符号链接“(symbolic Link),它包含了到原文件的路径信息。
(通俗来讲,其作用相当于Window系统下的桌面快捷)
特性
a. 软链接有自己的文件属性以及权限
b. 可以对不存在的目录和文件创建软链接
c. 软链接可以交叉文件系统
d. 删除软链接并不影响被指向的文件,但若被指向的原文件被删除,则相关软连接被称为死链接(即 dangling link,若被指向路径文件被重新创建,死链接可恢复为正常的软链接)
创建语法
1 | ln -s 源文件 目标文件 |
硬链接
解释
对源文件起了一个别名。
(通俗来讲,就是复制了一个源文件,但是他们是同步更新的,因为inode号相同)
特性
a. 只能对已存在的文件进行创建
b. 不能对目录进行创建,只能对文件进行创建
c. 文件有相同的inode号和data block
d. 删除一个硬链接文件并不会影响到其他拥有相同inode号的文件
创建语法
1 | ln 源文件 目标文件 |
今天的笔记就到这里啦,对于库有疑惑的不如自己去创建一个库试一下,对链接有疑惑的可以去去看这篇更通俗易懂的文章:http://t.csdn.cn/IYMWT
午安~
- 标题: Linux下的“库”和“链接”
- 作者: 这题超纲了
- 创建于: 2023-02-24 14:41:54
- 更新于: 2023-06-23 14:37:58
- 链接: https://qx-gg.github.io/2023/02/24/blog2/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。