静态库一般后缀为.a,lib和.a之间就是库的名字,由于整个库的内容都被整到了目标代码中,因此编译出来的执行程序比较大,但是优点就是不需要再依赖外部的函数库,当然如果静态库内容变了,整个程序也必须得重新编译;使用静态库,链接器会找出程序所需要的函数,然后将他们完整copy到执行文件,因此一旦链接成功,静态库也就不需要了
动态库一半后缀为.so,lib和.so之间就是库的名字,当然有时候还包括版本号;由于库的内容没有整合到程序中,而是在程序运行过程中动态地申请调用,所以运行环境中必须指定提供相应的库,但是如果动态库有所改变,只要程序能找到就不受影响,不需要重新编译;使用动态库,在程序执行过程中,会指明加载的动态库
linux下进行链接的默认操作是先链接动态库,也就是如果同时存在静态库和动态库,没特别说明,会首先链接动态库
1:静态库调用
lihui@LastWish ~ $ cat lihui1.c
#include <stdio.h>
int foo1(){
printf(“hello, lihui1!\n”);
return 0;
}
lihui@LastWish ~ $ cat lihui2.c
#include <stdio.h>
int foo2(){
printf(“hello, lihui2!\n”);
return 0;
}
lihui@LastWish ~ $ gcc -c lihui1.c lihui2.c
lihui@LastWish ~ $ ls *.o
lihui1.o lihui2.o
lihui@LastWish ~ $ ar -rsv libfoo.a lihui1.o lihui2.o
ar: 正在创建 libfoo.a
a – lihui1.o
a – lihui2.o
lihui@LastWish ~ $ ls libfoo.a
libfoo.a
lihui@LastWish ~ $ vim test.c
lihui@LastWish ~ $ cat test.c
#include <stdio.h>
int main(){
foo1();
foo2();
return 0;
}
lihui@LastWish ~ $ gcc test.c -L./ -lfoo
lihui@LastWish ~ $ ./a.exe
hello, lihui1!
hello, lihui2!
2:动态库调用
动态库一般都会先安装到系统目录,然后再通过Makefile里指定调用
比如接着上面,生成动态库gcc -o libfoo.so -shared -fPIC lihui1.c lihui2.c
但是在链接动态库的时候gcc -L./ -lfoo test.c
最后一定要用ldd来查看一下,是否ld.so.conf里任何目录都找不到我们的动态库,这时候就要指定一下才行,然后再ldconfig就欧了~!