摘要:今天给大家分享一下动态库和静态库的制作,相信大家已经忘记的差不多了吧,一起来复习复习吧!
库的本质:二进制文件
库的类型静态库和动态库(共享库)
静态库和动态库的区别在于加载程序的时机不同
静态库:在程序的编译阶段(链接阶段),将库中函数的代码以复制拷贝的方式加载到源程序中。
特点:① 占用资源空间,文件体积大
② 运行时不需要静态库的存在
③ 可移植性强
④ 优化升级时,需要重新编译源文件
动态库:在程序的运行阶段,只是将需要用到的函数做一个记录,最后在程序运行的阶段再加载需要用到的函数。
特点:① 不占用资源空间,文件体积小
② 运行时需要动态库的存在
③ 可移植性不强
④ 优化升级时,不需要重新编译源文件
一,静态库的制作
静态库的制作需要四个步骤,分别是:
1)先预留接口函数
2)实现所有函数功能
3)生成所有的.c文件的目标文件(以.o结尾的文件)
4)编译生成静态库
1)先预留接口函数:
eg:创建一个1.h文件:
#ifndef __HELLO__
#define __HELLO__
void hello(void);
void world(void);
#endif
2)实现所有函数功能
eg:创建hello.c
#include <stdio.h>
#include "1.h"
void hello(void)
{
printf("hello\n");
}
eg:创建world.c
#include <stdio.h>
#include "1.h"
void world(void)
{
printf("world\n");
}
eg:创建main.c
#include <stdio.h>
#include"1.h"
int main(int argc, char *argv[])
{
hello();
world();
return 0;
}
3)生成所有的.c文件的目标文件(以.o结尾的文件)
gcc -c hello.c
gcc -c word.c
gcc -c main.c
4)编译生成静态库
ar crs 库文件名 目标文件
静态库文件的命名规范: 以lib开头,以.a结尾,中间为库名
lib1.a --> lib1.a == 库文件名
1 == 库名
链接静态库:
gcc main.c -L. -l1(注 "L"后面有个 "." ,库在当前路径)
gcc main.c -l1 (库不在当前)
没链接库之前运行:
链接库之后:
二,动态库的制作
步骤几乎与静态库一样,但第三步指令不一样而且生成动态库时,后缀为.so
1)先预留接口函数
2)实现所有函数功能
3)将所有的.c文件生成对应的目标文件
gcc -c -fPIC hello.c -o hello.o
-fPIC -- 表示生成位置无关代码
4)编译生成动态库
gcc -shared -o libhello.so hello.o
动态库文件的命名规范:
以lib开头,以.so结尾,中间为库名
libhello.so --> libhello.so == 库文件名
hello == 库名
5)让库能正常被链接
(1) 把库拷贝到/usr/lib和/lib目录下。
(2) 在LD_LIBRARY_PATH环境变量中加上库所在路径。(只对当前shell有效)
(3) 添加/etc/ld.so.conf.d/*.conf文件,把库所在的路径加到文件末尾,并执行ldconfig刷新。
这样,加入的目录下的所有库文件都可见。
(4) 链接动态库:gcc main.c -L. -lhello
gcc -c -fPIC hello.c -o hello.o :
gcc -shared -o libhello.so hello.o
把动态库的路径加到/etc/ld.so.conf.d
打开方法:
添加到末尾:
执行ldconfig刷新
链接库运行:
今天的分享到此结束了,希望小伙伴们不要忘记这次的内容,哪里写的有问题的地方希望各个好哥们指正,谢谢各位读者姥爷的观看。咱们下次见。