动态库:
举个例子:下面这段代码,预处理,编译,汇编,链接生成二进制可执行文件。如果是动态库链接,到了执行printf()函数的时候,并不是直接在我们自己写的可执行文件中执行,而是通过链接动态库时给的printf函数的位置信息,到C库中找到printf函数,然后执行。
所以动态库的优点是 文件大小相比静态库会小很多,但与之对应的缺点就是对环境的需求。比如刚才的例子,动态库链接好了生成了可执行文件,运行也是ok的,但是如果某一天C库被删除了,这个文件就执行不了了。
#include <stdio.h>
int main()
{
printf("hello world!\n");
return 0;
}
静态库
链接静态库是将静态库的代码直接复制到目标文件中去。还是上面这段代码,如果是静态库链接,那么printf()函数执行就在这个文件中进行。所以静态库的链接使用的优点是,一旦静态库与目标文件链接成功,那么这个目标文件的使用对环境的要求就没有了,无论这个静态库是否被删除都能成功运行。但与相对的是文件的大小会比链接动态库会大很多。
静态库的创建与使用
创建一个名为 f1.c 的文件,下面是文件内容
include <stdio.h>
void f1()
{
printf("this is f1!\n");
}
创建一个名为 f2.c 的文件,下面是文件内容
include <stdio.h>
void f2()
{
printf("this is f2!\n");
}
创建一个名为 hello.c的文件,下面是文件内容
#include <stdio.h>
int main()
{
f1();
f2();
return 0;
}
第一步:将源文件汇编成二进制文件
gcc -c f1.c f2.c //会生成 f1.o f2.o 两个二进制文件
第二步:生成静态库
ar -cvr libx.a f1.o f2.o // x是静态库的名字,可以自己取, .a静态库的后缀
第三步:链接静态库
gcc hello.c -o hello -static -L . -l x
// -L 后面写上静态库所在路径 -l 后面写上静态库的名字
第一步:制作动态库
gcc -fPIC -shared -o libxx.so f1.c f2.c
// .so 是动态库的后缀
第二步:链接动态库
gcc hello.c -o hello -L . -l xx
// 默认动态编译