进程IO之 库
头文件:
#include < xxx .h > ---> 代表从系统路径下查找头文件 /usr/include
#include " xxx . h " --->先去当前路径下查找头文件,找不到再去系统路径下查找
头文件也就是以.h结尾的文件,其中包含:宏定义、结构体、共用体和枚举的定义、函数声明、外部引用、其他头文件、重定义typedef、条件编译
源文件:
包含main函数的xx.c包含子函数的xx.c (其声明放在头文件中)
库文件:
不能包括main函数!!!
本质是二进制文件
1. 库的定义
使用他人的函数时,除了包含头文件还可以用库文件
头文件:函数声明、结构体、共用体、枚举的定义、宏定义、重定义、外部引用、其他头文件。
库:把一些常用的函数的目标文件打包在一起,提供相应的函数接口,便于程序员使用。本质上来说库是一种可执行代码的二进制形式文件。
2. 库的分类
静态库和动态库:本质区别是代码被载入的时刻不同
2.1静态库
程序编译时,会被复制到目标代码中,以 .a 结尾
优点:程序运行时将不再需要该静态库,运行时无需加载库,运行速度更快,可移植性好
缺点:程序占用空间大,且升级改动不方便,需要重新编译链接
2.2动态库
程序运行时,被载入代码中,也叫共享库,以 .so 结尾
优点:程序体积小,升级改动方便
缺点:每次运行需要重新编译,运行速度慢,且可移植性差
3. 静态库的制作
(1)源文件编译生成目标文件
gcc -c fun1.c -o fun1.ogcc -c fun2.c -o fun2.o(2) 创建静态库用ar命令,将多个.o转换成.a//以lib为前缀,接着就是静态库的名字,扩展名为.a注意:ar命令格式 ar crs lib xxx .a xxx.o xxx.oar crs libfun .a fun1.o fun2.o(3) 测试使用静态库: gcc
//-L指定库的路径, -l指定库名
gcc main.c -L. -lfun



4. 动态库的制作
(1) 用gcc来创建共享库
//-fPIC创建与地址无关的编译程序
gcc -fPIC -c fun1.c -o fun1.o
gcc -fPIC -c fun2.c -o fun2.o
//生成动态库
gcc -shared fun1.o fun2.o -o libmyfun.so
//将动态库移动到系统路径下(因为系统使用动态库默认去系统路径 /usr/lib下找)
sudo mv libmyfun.so /usr/lib
(2) 测试使用动态库//因为系统使用动态库默认去系统路径下找,无需指定路径,即不需要 -Lgcc main.c -lmyfun
5.总结
何时将库载入程序 | 程序体积 | 移植性 | 升级 | |
静态库 | 编译阶段 | 大 | 好 | 麻烦 |
动态库 | 运行阶段 | 小 | 差 | 简单 |
6.库升级
升级前 升级后
静态:
![]()
动态:
![]()
补充:
(1)gcc的一些选项:
-L 路径:指定静态库的路径
-l(小写的L) 库名:指定库名
-I(大写i) 路径:指定头文件的路径,如果不指定默认的就是/usr/include
(2)ldd命令
ldd 可执行文件名:查看链接的动态库(3)同名的静态库和动态库:默认优先使用动态库,如果想使用静态库 需要在后面加 -static,这是内核规定的。
如果链接没有lib前缀的库文件,可以直接用-指定库的全名无需加l选项。