【Linux】软硬链接和动静态库
软硬链接
1.硬链接:让多个文件名对应同一个inode
创建file的硬链接文件:ln file abc
删除硬链接
- 在目录中将对应的记录删除
- 在硬链接中删除源文件,文件不会被真正删除,只是将硬链接数-1,如果为0,则将对应的磁盘释放
创建file的软连接文件: ln -s file abc
- 在符号链接(软链接)中,链接数永远是1
- 在符号链接中,删除源文件,源文件将被删除,其他链接文件将无法访问
静态库和动态库
1.静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不在需要静态库
2.生成静态库
(1)创建函数及对应的头文件
(2)gcc -c生成目标文件(.o文件)
(3)ar -rc libmymath.a add.o sub.o生成静态库
注:这里默认静态库名以.a结尾,前面加lib
ar -tv 用来查看静态库中的目录列表
(4)gcc main.c -L. -lmymath 使用
-L 指定库路径 -l 指定库名
测试目标文件生成后。静态库删掉,程序照样可以运行
假如一个外部文件要使用你的静态库,你只需要发将静态库和头文件就行
3.动态库(.so):程序在运行的时候才去链接动态库代码,多个程序共享使用库的代码
(2)在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中这个过程称为动态链接
(3)动态库在多个程序间共享,所以动态链接使得可执行文件更小,节省了磁盘空间。操作系统采用虚拟内存机制允许物理内存中的一份动态库被要用到该动态库的所有进程共用,节省了内存和磁盘空间
4.生成动态库
(1)创建函数及对应的头文件
(2)gcc -fPIC -c add.c sub.c fPIC产生位置无关码
gcc -shared -o libmymath.so *.o 生成动态库
(3)使用动态库 gcc main.o -o -L. -lmymath
编译选项:
- l 链接动态库,只要库名即可(去掉lib以及版本号)
- L 链接库所在路径
(4)运行动态库
方法一:拷贝.so文件到系统共享路径下,一般指/usr/lib cp libmath.so /usr/lib
方法二:更改LD_LIBRARY_PATH
方法三:
- 指定动态库的路径 /etc/ld.so.conf.d/名字conf 名字子=自定义
- ldd a.out哪个动态库找不到
- ldconfig 更新