静态库和动态库的区别:
静态连接库就是把(lib)文件中用到的函数代码直接链接进目标程序,程序运行的时候不再需要其它的库文件;
动态链接就是把调用的函数所在文件模块(DLL)和调用函数在文件中的位置等信息链接进目标程序,程序运行的时候再从DLL中寻找相应函数代码,因此需要相应DLL文件的支持。
静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib 中的指令都全部被直接包含在最终生成的 EXE 文件中了。但是若使用 DLL,该 DLL 不必被包含在最终 EXE 文件中,EXE 文件执行时可以“动态”地引用和卸载这个与 EXE 独立的 DLL 文件。静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。
1.制作静态库
[root@localhost Learn]# vim static_lib.c
书写库内容如下:
int add(int a,int b)
{
return a+b;
}
编译,生成目标文件static_lib.o
[root@localhost Learn]# gcc -c static_lib.c
使用ar工具创建静态库
[root@localhost Learn]# ar rcs static_lib.a static_lib.o
生成了static_lib.a,其中r参数表示将目标文件加入静态库,c参数表示若库不存在则创建这个库,s参数表示更新静态库的文件索引,使之包含新加入的目标文件的内容。写static_lib.h文件
int add(int a,int b);
写main.c文件
#include<stdio.h>
#include"static_lib.h"
int main()
{
int a = 2;
int b = 3;
printf("%d + %d = %d\n",a,b,add(a,b));
}
生成可执行程序
[root@localhost Learn]# gcc main.c static_lib.a -o app
[root@localhost Learn]# ./app
2 + 3 = 5
[root@localhost Learn]# ldd app
linux-vdso.so.1 => (0x00007fffd8b7b000)
libc.so.6 => /lib64/libc.so.6 (0x0000003248200000)
/lib64/ld-linux-x86-64.so.2 (0x0000003247a00000)
ldd 是用来查看链接那些动态链接库。
2.动态库的建立
我们将之前static_lib.c内容制作一个动态库,为了区分,复制一份[root@localhost Learn]# cp static_lib.c share_lib.c
[root@localhost Learn]# gcc -shared -fPIC -o share_lib.so share_lib.c
-fPIC选项用于生成位置无关的代码,share选项将位置无关代码制作为动态库。
生成可执行文件
[root@localhost Learn]# gcc main.c ./share_lib.so -o app_share
[root@localhost Learn]# ./app_share
2 + 3 = 5
[root@localhost Learn]# ldd app_share
linux-vdso.so.1 => (0x00007ffff073e000)
./share_lib.so (0x00007f8aeb12f000)
libc.so.6 => /lib64/libc.so.6 (0x0000003248200000)
/lib64/ld-linux-x86-64.so.2 (0x0000003247a00000)