库的制作 动态库和静态库
库的本质: 二进制文件
库的类型: 静态库,动态库(共享库),区别在于加载程序的时机不同
1. 静态库
在程序编译阶段链接阶段,将库中函数的代码以复制拷贝的方式加载到源程序中。
特点:
① 占资源空间,文件体积大
② 优化升级时需要重新编译源文件
③ 运行时不需要静态库存在
④ 可移植性强
静态库制作流程:
① 先预留接口函数
② 实现所有函数功能
③ 生成所有的 .c文件的目标文件(以 .o结尾的文件)
④ 编译生成静态库
ar rcs <库文件名> <目标文件>
ar命令
ar d <库文件名> <目标文件> //删除内部的目标文件
ar t <库文件名> //查看所含目标文件
/* 静态库文件的命名规范 */
以 lib 开头,以 .a 结尾,中间为 库名
eg.
libhello.a :
libhello.a 库文件名
hello 库名
/* 链接静态库 */
-l<库名> -L<path>
gcc main.c -lhello -L.
2. 动态库
在程序编译阶段,只是将需要用到的函数做一个记录(函数名),最后在程序运行阶段再加载需要用到的函数。
特点:
① 不占资源空间,编译之后可执行文件比较小
② 优化升级方便,程序不需要重新编译
③ 运行时需要动态库存在
④ 可移植性差
动态库的制作流程:
① 先预留接口函数
② 实现所有函数功能
③ 将所有的 .c 文件生成对应的目标文件
gcc -c -fPIC hello.c -o hello.o
-I<头文件路径>
-fPIC 表示生成位置无关代码
④ 编译生成动态库
gcc -shared -o libhello.so hello.o
③和④可以合为一句:gcc hello.c -fPIC -shared -o libhello.so
/* 动态库文件的命名规范 */
以 lib 开头,以 .so 结尾,中间为 库名
eg.
libhello.so :
libhello.so 库文件名
hello 库名
/* 链接动态库 */
gcc main.c -lhello
程序运行找不到动态库解决:
1. 将库文件拷贝到/usr/lib 和 /lib 目录下
2. 在LD_LIBRARY_PATH环境变量中加上库所在路径.(只对当前shell有效)
3. 添加/etc/ld.so.conf.d/<filename>.conf 文件,把库所在路径添加到文件末尾,并\
执行 ldconfig 刷新