动态库和静态库

动态库:

举个例子:下面这段代码,预处理,编译,汇编,链接生成二进制可执行文件。如果是动态库链接,到了执行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

// 默认动态编译

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值