目录
一、软硬链接
二、动静态库
1. 静态库
2. 动态库
一、软硬链接
软链接:ln -s myfile soft_file.link
硬链接:ln myfile hard_file.link
查看映射关系:ll -li
软硬链接区别:是否具有独立的inode
- 软链接具有独立的inode:可以当作独立文件
- 硬链接没有独立的inide:没有创建新文件
硬链接使用的是别人的inode和内容,就是在指定的路径下新增文件名和inode编号映射关系
当一个文件的硬链接数变为0时,一个文件才算真正的删除
新建文件的默认硬链接数为1,新建目录的默认硬链接数为0
软链接可视作快捷方式
二、动静态库
静态库:.a
动态库:.so
库:将 .o 文件链接之后的库文件和对应的 .h 文件进行打包
编译链接库:gcc -o 可执行文件 源文件 -I 库对应的头文件路径 -L 库的路径 -l 库名(去除前后缀)
(Include) (Lib)
安装:本质是拷贝,将程序的库和相关头文件拷贝到系统对应的路径下
- sudo cp 第三方库对应的头文件 系统头文件路径(/usr/include)
- sudo cp 第三方库系统路径库(/lib64)
动态库:
- .c 文件用gcc汇编成 .o 文件时,加上 -fPIC(与位置无关码)
- 链接 .o 文件时加上 -shared ,表示形成的不是可执行文件,而是动态库
编译链接完成后,告诉OS和shell动态库位置:
- 和静态库类似,将 .h 文件和 .so 文件复制到系统路径下
- 添加环境变量,但系统重启后失效
- 配置 /etc/ld.so.conf.d 文件,在此目录下创建一个 *.conf 文件,将第三方动态库的路径写入该文件,然后在该文件目录用idconfig 更新设置
- 建立软链接,在当前路径或者系统路径下创建动态库的软链接,系统默认路径是当前路径和系统库路径
使用第三方库:
- 安装第三方库
- 编译的时候加上库名
gcc默认是动态链接(建议行为),对一个特定的库,究竟是静态还是动态,取决于库本身是静态还是动态
1. 静态库
原理:将库代码拷贝到代码区
库编写者writer
libmymath.a: add.o sub.o
ar -rc $@ $^
add.o: add.c
gcc -c add.c
sub.o: sub.c
gcc -c sub.c
.PHONY:output
output:
mkdir -p mylib/include
mkdir -p mylib/lib
cp -f *.h mylib/include
cp -f *.a mylib/lib
.PHONY:clean
clean:
rm -rf *.o libmymath.a
用户user
交付库(安装)
编译链接库
安装
注:不建议将测试代码、测试库直接放入系统库中
2. 动态库
原理:指定函数的地址,写入到可执行程序中
库编写者write
libmymath.so: add.o sub.o
gcc -shared -o $@ $^
add.o: add.c
gcc -c -fPIC add.c
sub.o: sub.c
gcc -c -fPIC sub.c
.PHONY:output
output:
mkdir -p mylib/include
mkdir -p mylib/lib
cp -f *.h mylib/include
cp -f *.so mylib/lib
.PHONY:clean
clean:
rm -rf *.o libmymath.so mylib
用户user
告诉OS和shell动态库位置
方案一:安装,类似静态库(略)
方案二:添加环境变量,重启中断之后失效
方案三:配置 /etc/ld.so.conf.d 文件,永久有效
方案四:建立软链接,永久有效