静态库(.a):程序在编译链接时将库的代码链接到可执行文件中。程序运行时将不再需要静态库。
缺点:文件会变大。
下面用一个例子来说明静态链接库:
有add.c、sub.c、mul.c、div.c文件,实现加减乘除。
add.h
#pragma once
int add(int a,int b);
add.c
1 #include"add.h"
2
3 int add(int a,int b)
4 {
5 return a+b;
6 }
sub.h
1 #pragma once
2 int sub(int a,int b);
sub.c
1 #include"sub.h"
2
3 int sub(int a,int b)
4 {
5 return a-b;
6 }
mul.h
#pragma once
int mul(int a,int b);
mul.c
1 #include"mul.h"
2
3 int mul(int a,int b)
4 {
5 return a*b;
6 }
div.h
#pragma once
int div(int a,int b);
div.c
1 #include"div.h"
2
3 int div(int a,int b)
4 {
5 return a/b;
6 }
main.c
1 #include<stdio.h>
2 #include"add.h"
3 #include"sub.h"
4 #include"mul.h"
5 #include"div.h"
6
7 int main()
8 {
9 int a=10;
10 int b=5;
11 printf("add(10,5)=%d\n",add(a,b));
12
13 printf("sub(10,5)=%d\n",sub(a,b));
14
15 printf("mul(10,5)=%d\n",mul(a,b));
16 printf("div(10,5)=%d\n",div(a,b));
17 }
下面将其编译成静态链接库:
makefile文件如下:
1 main:main.c libmymath.a
2 gcc main.c ./libmymath.a -o main
3 libmymath.a:
4 gcc -c add.c -o add.o
5 gcc -c sub.c -o sub.o
6 gcc -c mul.c -o mul.o
7 gcc -c div.c -o div.o
8 ar -rc libmymath.a add.o sub.o mul.o div.o
9 .PHONY:clean
10 clean:
11 rm main libmymath.a add.o sub.o mul.o div.o
说明:将其合并成一个静态链接库libmymath.a, -L表示当前目录下寻找。
ar -rc libmymath.a add.o sub.o mul.o div.o是一个打包命令。
扫描二维码关注公众号,回复:
1076233 查看本文章
动态库(.so):程序在运行时候才去链接动态库的代码,多个程序共享使用库的代码。
动态链接:在可执行文件开始运行之前,外部函数的机器码由操作系统从磁盘上的动态库中复制到内存中,此过程为动态链接。
优点:动态库可以在多个程序间共享,所以动态链接使得可执行文件更小,节省空间。
makefile的编写:
1 main:main.c libmymath.so
2 gcc main.c ./libmymath.so -o main
3 libmymath.so:
4 gcc -fPIC -c add.c sub.c mul.c div.c
5 gcc -shared -o libmymath.so *.o
6 .PHONY:clean
7 clean:
8 rm main libmymath.so
说明:shared表示生成共享库格式。
-fPIC:产生位置无关码。
*.o:表示当前的所以.o文件。
结果显示:
file libmymath.so
libmymath.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, not stripped
linux下的动态库的类型为ELF类型。