Linux下静态库与动态库的使用
Linux下有静态链接库和动态链接库两种,静态链接库的后缀名是.a,动态链接库的后缀名是.so,下面详细介绍:
静态链接库:
静态链接库是指程序在编译链接的过程中就把依赖的库插入到程序中,这样程序的运行就不需要这些库的支持,但缺点是文件变大,下面以一个例子介绍如何制作静态链接库:
有add.c和mul.c两个文件,分别实现两数相加与相乘:
add.c:
int my_add(int num1, int num2)
{
return num1 + num2;
}
mul.c:
int my_mul(int num1, int num2)
{
return num1 * num2;
}
还有一个computer.h头文件,声明了上面两个函数:
int my_add(int num1, int num2);
int my_mul(int num1, int num2);
还有一个main.c文件调用这两个函数:
#include <stdio.h>
#include "compute.h"
int main()
{
int a=3, b=5;
printf("%d + %d = %d\n", a, b, my_add(a, b));
printf("%d * %d = %d\n", a, b, my_mul(a, b));
return 0;
}
gcc -o add.a -c add.c -static
gcc -o mul.a -c mul.c -static
ar -rc libcompute.a add.a mul.a
上面首先把add.c和mul.c编译成两个独立的.a文件,然后把他们合并成一个静态链接库libcompute.a(当然你也可以把它们做成两个静态链接库,连接main的时候指定这两个就可以了)。static表示编译成静态链接库。ar是一个打包命令。
现在静态链接库libcompute.a做好了,下面我们把它插入到main.c中:
gcc -o main main.c -lcompute -L.
上面的-lcomputer表示要链接的静态链接库是libcomputer.a,-L.表示在当前目录下寻找。
为了方便,我们把上面的命令写在一个Makefile里:
Makefile:
all:
gcc -o main main.c -lcompute -L.
lib:
gcc -o add.a -c add.c -static
gcc -o mul.a -c mul.c -static
ar -rc libcompute.a add.a mul.a
clean:
rm -f *.o *.a main
首先:make lib 生成静态链接库
然后:make 生成最终的main可执行文件
这样就可以了,运行main,正确输出结果了:
3 + 5 = 8
3 * 5 = 15
Makefile:
all:
gcc -o main main.c -ladd -lmul -L.
lib:
gcc -o libadd.a -c add.c -static
gcc -o libmul.a -c mul.c -static
clean:
rm -f *.o *.a main
当然为了简便,我们可以只运行一个命令就搞定所有的事情:
Makefile:
all: lib
gcc -o main main.c -lcompute -L.
lib:
gcc -o add.a -c add.c -static
gcc -o mul.a -c mul.c -static
ar -rc libcompute.a add.a mul.a
clean:
rm -f *.o *.a main
只要一个make命令就搞定了~~
动态链接库:
完成!