1.静态库与动态库
- 静态库(.a):程序在编译链接时把库的代码链接到可执行程序中,程序运行的时候不需要静态库。
- 动态库(.so): 程序在运行的时候链接动态库的代码,多个程序共享库的代码。
- 与动态库链接的可执行程序中只包含它所用到函数入口地址的一张表。
- 在可执行程序运行之前,外部函数的机器码会被操作系统从动态库中复制到内存----动态链接
- 动态库可以在多个程序之间共享,所以使动态链接的可执行文件更小,节省了磁盘空间,在内存中可以被要用到该动态库的所有进程共用,所以节省了内存。
2.测试代码:github代码
add.h
add.c
test.c
3.生成静态库:
转换为二进制码:
gcc -c add.c -o add.o
生成静态库:(ar是gnu归档工具,rc表示(replace and create))
ar -rc libmy.a add.o
查看库中列表:t:列出静态库中的文件 v:verbose 详细信息
ar -tv libmy.a
编译链接:-L 指定库路径 -l 指定库名gcc test.c -L. -lmy
4.生成动态库
生成动态库
- shared: 表示生成共享库格式
- fPIC:产生位置无关码(position independent code)
- 库名规则:libxxx.so
gcc -fPIC -c add.c
gcc -shared -o libmy.so *.o
使用动态库
运行动态库
- 1、拷贝.so文件到系统共享库路径下, 一般指/usr/lib
- 2、更改 LD_LIBRARY_PATH