如果把库比作是放在图书馆中的一本本书那么
动态库:只借阅,不卖出
静态库:直接卖出
动态库在源文件编译的时候并不会将代码数据拷贝进去,只会在程序运行的时候,链接完成一部分功能,当动态库从指定路径移除,程序无法正常运行,但好处在于使用动态库的程序体积较小。
静态库在源文件编译的时候直接将代码数据拷进一起编译,当程序运行的时候不再受静态库影响,静态库无论消失与否,程序依然正常运行,但代价就是程序体积较大。
动态库好处在于,更新方便,升级模块功能时候只要将对应库升级即可,而静态库需要将整个程序重新编译。
制作方法:
前置条件:
功能函数的相关.c文件,假设现有两个功能函数文件:
power.c
int power(int base,unsigned int pow)
{
if(pow == 0)
return 1;
else if(pow == 1)
return base;
else
return base*power(base,pow-1);
}
swap.c
int swapint(int *a,int*b)
{
*a = *a ^ *b;
*b = *a ^ *b;
*a = *b ^ *a;
}
动态库制作方法:
(1)用gcc将power.c和swap.c两个文件编译成.o文件,注意加选项-fPIC
gcc power.c -o power.o -c -fPIC
gcc swap.c -o swap.o -c -fPIC
(2)将两个.o文件合成.so文件,注意库名称,假如名称叫yc,必须带前缀lib和后缀.so,即假如我想把新建库起名叫yc,我就要在制作时候填写完整名称libyc.so
gcc -fPIC -shared -o libyc.so swap.o power.o
(3)制作完成
静态库制作方法:
(1)用gcc将power.c和swap.c两个文件编译成.o文件
gcc swap.c -o swap.o -c
gcc power.c -o power.o -c
(2)使用ar将两个.o文件合成.a文件,同样注意库名称,假如名称叫yc,必须带前缀lib和后缀.a,即假如我想把新建库起名叫yc,我就要在制作时候填写完整名称libyc.a
ar rcs libyc.a swap.o power.o
(3)制作完成