linux中静态库与共享库的生成与使用


一、什么是库文件

库是一组预先编译好的方法的集合。Linux系统存储的库的位置一般在:/lib 和 /usr/lib。
在 64 位的系统上有些库也可能被存储在/usr/lib64 下。库的头文件一般会被存储 在/usr/include 下或其子目录下。

库文件分为两种:一种是静态库,命令规则是libxxx.a;一种是共享库,命令规则是libxxx.so。

例如:
libfoo.a libc.so.6 libthread.so

二、库文件的生成与使用

a. 静态库的生成与使用

a.1 静态库的生成:

首先需要生成静态库的“.c”文件用来存放函数的定义,以及一个“.h”头文件用来存放函数声明。

在这里插入图片描述
这里有add.c 和max.c,其中add.c定义了两数之和的函数,max.c定义了比较两个数的大小的函数;foo.h中存放着这两个函数的声明。

第一步:先将需要生成库文件的所有“.c“文件编译成“.o”文件。

在这里插入图片描述

第二步:使用 ar 命令将第一步编译的所有”.o”文件生成静态库。(静态库的命名必须是libxxx.a)
其中,c是创建库,r是将方法添加到库中,v是显示过程。
在这里插入图片描述
这样,一个静态库libfoo.a就创建完成。

a.2 静态库的使用:

首先,创建一个main.c文件
在这里插入图片描述
使用静态库libfoo.a和main.c生成可执行程序main并运行
在这里插入图片描述
在main.c文件中,这里用到的是#include"foo.h",之所以用到的是#include“foo.h”而不是#include<foo.h>,是因为#include"xxx.h"是在程序当前目录下寻找这个头文件,而#include<xxx.h>是在编译器的类库路径中寻找。

如果想要引用#include<foo.h>,需要做如下操作:

(1)将foo.h头文件移动到编译器的类库路径中(需要管理员权限)
(2)将main.c中#include"foo.h"改成#include<foo.h>
(3)使用静态库libfoo.a和main.c生成可执行程序main并运行
在这里插入图片描述
在这里插入图片描述

b. 共享库的生成与使用

b.1 共享库的生成

跟静态库的生成一样,首先需要生成静态库的“.c”文件用来存放函数的定义,以及一个“.h”头文件用来存放函数声明。

在这里插入图片描述
第一步:先将需要生成库文件的所有“.c“文件编译成“.o”文件。

在这里插入图片描述
第二步:使用 gcc命令将第一步编译的所有”.o”文件生成共享库。(共享库命名必须使libxxx.so)

在这里插入图片描述

这样一个共享库libfoo.so就创建完成。

b.2 共享库的使用

首先,创建一个main.c文件
在这里插入图片描述

使用共享库libfoo.so和main.c生成可执行程序main
在这里插入图片描述

将libfoo.so移动到/usr/lib中,运行main程序
在这里插入图片描述
ps:为什么静态库不需要移动到/usr/lib中,而共享库需要?

因为编译器在链接的时候,会把静态库中函数的声明以及定义都链接到main文件中,而只能将共享库中的函数声明链接到main中,所以在使用共享库时,需要在类库路径中寻找函数的定义,从而使程序可以运行。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

__小柒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值