静态库

程序所要用到的库函数代码在链接时全部被copy到程序,如果有多个进程在内存中同时运行,并且使用了相同的库函数,那么就会有多份拷贝,这就是对空间的浪费。(静态链接库以*.a为后缀)

建立mylib.c

int add(int a,int b)
{
return a+b;
}

编译文件并输出目标文件

gcc -c mylib.c -o mylib.o

将编译出的mylib.o文件打包成静态连接库

ar cqs libmylib.a mylib.o

将libmylib.a文件复制到/usr/lib目录下

cp libmylib.a /usr/lib

调用静态库文件 main.c

#include <stdio.h>
int main()
{
printf("1+3=%d\n",add(1,3));
return 0;
}

编译运行

gcc -static -lmylib main.c -o main

./main

参数:

"-c":编译选项,只对程序做编译,不链接。
"-static":编译选项,静态编译程序。
"-l":编译选项,指定被编译的程序所依赖的库文件。
ar cqs lib(静态库名).a 被制作的库文件(*.o)。

 

动态库

1.建立boye.c
int reduce(int a,int b)
{
return a-b;
}

2.编译文件并输出目标文件mylib.o
gcc -c boye.c -o boye.o

3.将boye.o 制作成动态链接库,执行命令
gcc -shared -fPIC boye.o -o liboye.so

4.将liboye.so动态链接库文件复制到/usr/lib目录下

5.编译
gcc  main.c -o main  -lboye

 

总结:
readelf -d 可执行程序:查看可执行程序使用了哪些动态链接库。
gcc -shared -fPIC(库文件名).o -o(动态链接库文件名).so :将库文件制作成动态库。
-fPIC:使输出的对象模块是按照可重定位地址方式生成的。
-shared:指明产生动态链接库。

 posted on 2021-02-22 22:25  boye169  阅读(80)  评论(0编辑  收藏  举报