快乐Linux —— 3. 链接文件 & 静态动态库
参考博文:
https://blog.csdn.net/yuexiaxiaoxi27172319/article/details/45241923
0. 简述
简单看看链接文件,了解静态库,动态库的概念。
1. 链接文件:
- 可以用stat 查看文件的inode,block占用等信息
- 为解决文件的共享使用,Linux引进硬链接和软链接,链接为 Linux 系统解决了文件的共享使用,还带来了隐藏文件路径、增加权限安全及节省存储等好处
- 硬链接
ln file hard_link
- 文件移动的话,不用考虑软连接的更新;对重要文件备份
- 相当于一个inode对应多个文件名
- 不能对目录进行创建,只可对文件创建,并且只能对已存在的文件创建;
- 删除一个硬链接文件并不影响其他有相同 inode 号的文件。
- 软连接
ln -s file soft_link
- 常用为一个文件添加快捷方式
- 相当于一个特殊文件,文件中保存的数据是另一个文件的inode,有自己的文件属性及权限等;
- 可对存在或不存在的文件或目录创建软链接,相当于windows中快捷方式;
- 创建软链接时,链接计数 i_nlink 不会增加;
- 删除软链接并不影响被指向的文件,但若被指向的原文件被删除,则相关软连接被称为死链接(若被指向路径文件被重新创建,死链接可恢复为正常的软链接,inode值会重新更新)
3. 静态库和动态库
为什么会产生静态库和动态库?或者说库文件有什么好处?
以简单的库函数 sin , cos
- 将math 里的函数制成一个可重定位文件(.o)中 ,然后将这个文件链接到可执行文件中。但这样就相当于每个程序都会包含一个math库,引用的未引用的函数都在,非常浪费磁盘空间,同样的当程序运行起来时,加载要耗内存。此外开发维护困难,因为每次更改都要编译整个库文件。
- 把每个函数单独弄成一个 .o 文件,然后需要哪个链接哪个。但这样需要程序员显式链接每个用到的函数,非常繁琐。
- 静态库技术,将math里函数打包成一个静态库,然后链接器在链接阶段将静态库中引用到的内容直接合并到可执行文件中。这样不但只需要链接一个库,并且程序中只会有引用的函数。
- 动态库技术,静态库虽然已经不错了,但是还是有一些明确缺点。静态库需要定期维护和更新,在每个运行的程序都会包含一个副本,浪费内存。而动态库是一个目标文件,在运行和加载时可以加载到任意内存地址,并和一个内存中的程序链接起来,这个过程也叫动态链接。这样在内存中一个共享库的副本可以被多个程序使用。
-
静态库 .lib .a
gcc -c mymath.c
//gcc -c 将要制成库的文件
ar crv libmymath.a mymath.o
//ar crv lib库名.a 汇编后生成的.o文件gcc -o main domath.c -L. -lmymath
//gcc -o 可执行文件 主函数源文件 -L库的路径 -l库名 -
动态库 .dll .so
gcc -shared -fPIC -o libmymath.so mymath.c
//gcc -shared -fPIC -o lib库名.so 要制成库的文件
是一个不能单独执行的可执行文件,程序在链接阶段仅仅是找到共享库中函数定义的地方,在程序执行时操作系统动态的将共享库加载到内存上来执行。
!!! 注意程序可能找不到写的共享库