Linux下的“库”和“链接”

Linux下的“库”和“链接”

这题超纲了 柳筋

1.库是计算机上的一类文件,可以简单地把库当作代码仓库,提供给使用者一些可以直接使用的变量、函数或者类。

2.库是一种特殊的一种程序,编写库的程序和编写普通程序的差别不大,只是库不能单独运行。

3.库分为:静态库和动态库。区别在于静态库在程序的链接阶段被复制到程序中,动态库则没有被复制,而是在程序每次运行的时候由系统动态加载到内存中供程序使用

库的好处
  1. 库里面的代码比较保密,不容易被看到
  2. 方便程序的部署和分发

静态库

命名规则

1.在Linux下,静态库一般写为:libxxx.a
lib:前缀,是固定的,每个静态库都有;xxx:静态库的名称;.a:固定后缀)
2.在Window下,静态库一般为:libxxx.lib,与上面的相比,只有后缀是不同的

静态库的制作

  1. 首先需要将写好的程序编译成.o文件,也就是上图中倒数第二步形成的文件
  2. 使用ar工具,将.o文件打包
    1
    2
    3
    g++/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
2
3
4
5
#include <iostream>
using namespace std;

int add(int& a,int &b);
int sub(int &a,int &b);
add.cpp
1
2
3
4
5
6
#include "head.h"

int add(int &a,int &b)
{
return a+b;
}
sub.cpp
1
2
3
4
5
6
#include "head.h"

int sub(int &a,int &b)
{
return a-b;
}
main.cpp
1
2
3
4
5
6
7
8
#include "head.h"

int main()
{
int a=10,b=10;
cout<<add(a,b)<<endl;
cout<<sub(a,b)<<endl;
}

1.将add.cpp 和sub.cpp 封装成静态库

1
2
3
4
5
g++ -c add.cpp -o add.o
g++ -c sub.cpp -o sub.o

ar rcs libadd.a add.o
ar rcs libsub.a sub.o

2.将main.cpp编译成可执行文件(此时main.cpp里面使用到了add.cpp和sub.cpp,所以需要用到libadd.a和libsub.a)

1
2
3
4
g++ main.cpp -o main.out -L ./ -l add -l sub -I ./
./main.out
输出: 20
0

动态库

命名规则

  1. 在Linux下,动态库一般为libxxx.so,除了后缀不同,其他是一样的
  2. 在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
2
3
在终端输入:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:动态库的绝对路径
缺点就是每次关闭终端后,临时环境变量就会生效
方法二:永久添加
1
2
3
在home目录下,打开.bashrc文件,在最后一行添加:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:动态库的绝对路径
然后把保存退出,输入..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 进行许可。
推荐阅读
C++11新特性 C++11新特性 Linux下常用命令 Linux下常用命令 浙江宇视科技一面 浙江宇视科技一面
 评论