Linux:库文件的生成与使用

库文件概念

库文件:就是一组预先编译好的函数的集合。包括静态库和和共享库。
其名称一般是以 lib 开头的。

位置:

  1. Linux系统存储库的位置一般在 /lib 和 /usr/lib中。
  2. 库的头文件一般会被存储在/usr/include 下或其子目录下。

静态库: 命名规则一般是以 libxxx.a 的形式
共享库: 一般是以 libxxx.so 的形式。

静态库的生成与使用

静态库的生成

首先需要组成库文件的 “.c" 文件。我这里写了两个简单的函数,分别是求和和求最大值函数。

在这里插入图片描述

但是这两个方法,别人不知道,所以写一个头文件声明这两个函数。

在这里插入图片描述

步骤

一、先将所有需要生成库文件的".c" 文件编译为 “.o” 文件。

示例:
这里将 add.c 和 max.c 编译为 .o文件
在这里插入图片描述

二、使用 ar 命令 将第一步编译的所有”.o”文件生成静态库。

可选:

  • c —— 创建库
  • r —— 将方法添加到库中
  • v —— 显示过程

如图所示,这样静态库文件就生成成功了。

在这里插入图片描述

静态库的使用

这里用一个写主函数的文件来测试一下这个库文件。

在这里插入图片描述

正常编译时,却会产生错误

因为编译时系统并不知道这个库文件在哪,到底是在当前位置,还是在其他目录下面。

在这里插入图片描述

所以对于这一类程序,需要使用专属的命令。

  • -L —— 指定库的存储位置
  • -l —— 指定库的名称(不需要前面的‘lib’和扩展名‘.a’)

如图,这样操作就生成可执行程序main 了
在这里插入图片描述

运行示例:成功

在这里插入图片描述

学会了库文件,下次再想使用上面这两个方法,就可以在编译时直接指定某个库就好了。

可选:将生成的库文件移动到 usr/lib 和 usr/include下面,在编译链接时候就不用加上库的指定路径了,因为链接时 ,默认会去 lib 和 include里找。

如图:
在这里插入图片描述

共享库的生成与使用

共享库的生成

命令:

gcc -shared -fPIC -o libxxx.so +所需的‘.o’文件

在这里插入图片描述

共享库的使用

主函数还是不变
在这里插入图片描述

当我像静态库那样编译链接时,却执行不了,原因如下,说找不到这个共享库。

在这里插入图片描述

解释 : 因为我只把库的位置告诉了gcc,而要运行main程序并不知道这个库在哪,只会去C标准库里去找,现在标准库里还没有这个库,所以没找到。

解决方法:
将这个共享库移动到标准库下面,就可以执行了。

在这里插入图片描述

另外, 可以通过 ldd 命令查看可执行程序使用了哪些共享库:
比如,我这里先将 “libfoo.so” 删掉,这里就显示 “libfoo.so” 未找到。

在这里插入图片描述

静态库和共享库的区别

静态库在链接时将用到的方法包含到最终生成的可执行程序中,而共享库不包含,只做标记,在运行程序时,才动态加载

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

_索伦

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

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

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

打赏作者

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

抵扣说明:

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

余额充值