库
库是计算机上的一类文件,可以简单地把库当作代码仓库,提供给使用者一些可以直接使用的变量、函数或者类。
库是一种特殊的一种程序,编写库的程序和编写普通程序的差别不大,只是库不能单独运行。
库分为:静态库和动态库。区别在于静态库在程序的链接阶段被复制到程序中,动态库则没有被复制,儿时在程序每次运行的时候由系统动态加载到内存中供程序使用。

库的好处:①.库里面的代码比较保密,不容易被看到
②.方便程序的部署和分发
静态库
- 命名规则
在Linux下,静态库一般写为:libxxx.a
(lib:前缀,是固定的,每个静态库都有;xxx:静态库的名称;.a:固定后缀)
在Window下,静态库一般为:libxxx.lib,与上面的相比,只有后缀是不同的
- 静态库的制作
首先需要将写好的程序编译成.o文件,也就是上图中倒数第二步形成的文件
使用ar工具,将.o文件打包
g++/gcc -c xxx -o xxx.o
ar rcs libxxx.a xxx.o
(r:将文件插入备存文件中 c:建立备存文件 s:索引)
- 静态库的使用
g++/gcc xxx -o xxx.out -L 库的路径 -l 库的名称(libxxx.a中的xxx就是库的名称) [-I 头文件的路径](在同个目录下就不需要这一项)
- 做个简单的测试
head.h
#include <iostream>
using namespace std;
int add(int& a,int &b);
int sub(int &a,int &b);
add.cpp
#include "head.h"
int add(int &a,int &b)
{
return a+b;
}
sub.cpp
#include "head.h"
int sub(int &a,int &b)
{
return a-b;
}
main.cpp
#include "head.h"
int main()
{
int a=10,b=10;
cout<<add(a,b)<<endl;
cout<<sub(a,b)<<endl;
}
将add.cpp 和sub.cpp 封装成静态库
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
将main.cpp编译成可执行文件(此时main.cpp里面使用到了add.cpp和sub.cpp,所以需要用到libadd.a和libsub.a)
g++ main.cpp -o main.out -L ./ -l add -l sub -I ./
./main.out
输出:20
0
动态库
- 命名规则
在Linux下,动态库一般为libxxx.so,除了后缀不同,其他是一样的
在Window下,一般为libxxx.dll
- 动态库的制作
gcc得到.o文件,与静态库不同的是,这个过程需要得到的是与位置无关的代码
gcc/g++ -c -fpic/-fPIC a.c b.c -o a.o b.o
gcc得到动态库
gcc/g++ -shared a.o b.o -o libxxx.so
- 动态库的使用
g++/gcc xxx -o xxx.out -L 库的路径 -l 库的名称(libxxx.so中的xxx就是库的名称) [-I 头文件的路径](在同个目录下就不需要这一项)
与静态库不同的是,想要使用动态库,就必须配置环境变量!
如何配置环境变量?
方法一:临时添加
在终端输入:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:动态库的绝对路径
缺点就是每次关闭终端后,临时环境变量就会生效
方法二:永久添加
在home目录下,打开.bashrc文件,在最后一行添加:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:动态库的绝对路径
然后把保存退出,输入..bashrc启用
可以用(ldd 可执行文件名)命令查看可执行文件名的依赖关系,需要在可执行文件的目录下使用
动态库与静态库的对比
- 程序编译成可执行文件的过程
共同点:都是在链接阶段与目标代码等链接成可执行文件
不同点:静态库在链接阶段的时候,会把库中的代码打包到可执行文件中,相当于把库中的代码复制到可执行文件中;动态库则是当可执行文件代码运行到含动态库代码时,加载动态库。
- 创建过程
创建方法不同,具体看上面
- 库的使用
使用命令是一样的,但是动态库使用前需要预先设置环境变量
- 静态库的优缺点
优点:
静态库链接时打包到可执行程序中的加载速度较快
发布程序时不需要提供静态库,移植方便
缺点:
消耗系统资源,浪费内存
更新,部署,发布程序时较麻烦
- 动态库的优缺点
优点:
可以实现进程间资源共享(共享库)
更新,部署,发布程序时简单
可以控制何时加载动态库
缺点:
加载速度比静态库慢
发布程序时需要提供依赖的动态库
链接
链接分为:软链接和硬链接
软链接
解释:
软链接又叫做“符号链接“(symbolic Link),它包含了到原文件的路径信息。
(通俗来讲,其作用相当于Window系统下的桌面快捷)
特性:
软链接有自己的文件属性以及权限
可以对不存在的目录和文件创建软链接
软链接可以交叉文件系统
删除软链接并不影响被指向的文件,但若被指向的原文件被删除,则相关软连接被称为死链接(即 dangling link,若被指向路径文件被重新创建,死链接可恢复为正常的软链接)
创建语法:
ln -s 源文件 目标文件
硬链接
解释:
对源文件起了一个别名。
(通俗来讲,就是复制了一个源文件,但是他们是同步更新的,因为inode号相同)
特性:
只能对已存在的文件进行创建
不能对目录进行创建,只能对文件进行创建
文件有相同的inode号和data block
删除一个硬链接文件并不会影响到其他拥有相同inode号的文件
创建语句:
ln 源文件 目标文件
今天的笔记就到这里啦,对于库有疑惑的不如自己去创建一个库试一下,对链接有疑惑的可以去去看这篇更通俗易懂的文章:http://t.csdn.cn/IYMWT
2023.1.14