当前位置: 首页 > news >正文

Linux初学记第四章--有关库同学的那些事

什么是库文件

简单来说,库文件就是别人写好、编译完成、封装好的一个现成的代码包,这可以让我们不用从零开始写代码,直接调用库里面的函数就可以实现功能。Linux系统中存储的库的位置一般在/lib和/usr/lib。在64位系统上有一些库的位置可能还在/usr/lib64下。

库分为两种,一种是静态库,它的命令规则是libxxx.a,还有一种是共享库,命令规则是libxxx.so。

静态库的生成与使用

静态库的生成

下面是需要生成静态库的.c文件 其中"foo.h"中是函数的声明 "add.c"和"max.c"是函数的定义

在这里我们先说一下为什么要让.c文件生成静态库,其实上一章已经有提到原因:

我们是可以将全部的.c文件一起参与编译链接生成可执行文件,但如果工程文件很多的时候,这样做就会非常浪费时间,编译速度很慢,而我们的静态库.a是编译完成后的二进制文件,别人调用的时候不用再编译我们的源码,只进行链接就行。并且我们打包成为一个库文件就避免文件紊乱,只需要传递一个文件加头文件即可。

然后我们将这些.c文件都编译为.o文件

使用ar命令将编译的所有.o文件生成静态库

此处我们看到的libfoo.a就是我们生成的静态库

c 创建库

r 将方法添加到库中

v 显示其过程

静态库的使用

首先先写一个main.c

再使用静态库"libfoo.a"和"main.c"生成可执行文件

-L 指定库的存储路径 告诉gcc去哪里找库文件

. 代表当前文件夹

-l 指定库的名称 链接库

共享库的生成与使用

共享库的生成

下面是需要生成共享库的.c文件 其中"foo.h"中是函数的声明 "add.c"和"max.c"是函数的定义

其实和静态库过程一样,首先我们还是要把需要生成库文件的所有".c"文件编译成".o"文件

然后使用gcc命令将第一步编译的所有".o"文件生成共享库

- 程序的选项(参数开关)

-shared 告诉gcc生成共享库

-fPIC 告诉编译器在编译.o的时候要生成不绑定固定内存地址的机器码

PIC Position-Independent Code位置无关代码 普通.o目标文件代码地址是写死的,动态库,要可以被不同程序加载到内存任意位置运行,不可以写死地址

-o 指定输出文件(output)

共享库的使用

以下是测试代码main.c的内容

再使用共享库"libfoo.so"和"main.c"生成可执行文件,并进行执行

如果在库的存储路径有相同的共享库和静态库,gcc默认使用共享库

在这里我们会发现出错了,是因为系统加载共享库时,找不到对应的共享库文件,因为系统一般默认去存储库的标准位置去加载(/lib或/usr/lib等),而不会在当前位置下寻找。

所以将库拷贝到/usr/lib下,再执行程序

如果库不在标准位置下,也可以通过设置环境变量"LD_LIBRARY_PATH"来指定加载库的路径。

同时,我们还解锁了一个功能,可通过ldd命令查看可执行程序使用了哪些共享库

静态库与共享库的区别

静态库会把用到的函数实现拷贝到可执行程序中,只拷贝用到的方法。

共享库链接时,不拷贝,只做标记,在运行程序时还需要链接,共享库装载到内存中多个程序可以共享使用。

使用共享库可以节省内存,很多程序同时使用foo库,内存里面只需要加载一份libfoo.so,不是每个程序都要复制一份库代码;升级也方便,直接替换新的libfoo.so文件,程序功能就更新;程序体积也小。

http://www.jsqmd.com/news/1392254/

相关文章:

  • TVA-具身智能最新进展(2):创造力引擎与开放式创新
  • 视频平台有 200 多种识别算法,实际项目到底应该怎么选?
  • C# 析构函数全详解:原理+实战+避坑
  • 2026肇庆自动门、旋转门五金配件去哪采购靠谱? - LYL仔仔
  • [基于AgentEvals的自动化评估-03]全面优化面向LangGraph的轨迹评估
  • Pixelle-Video 全自动短视频引擎指南:零基础 5 分钟生成第一条 AI 视频
  • 从英文劝退到全中文丝滑:Burp Suite 汉化启动器部署手记
  • Redash数据可视化入门:不写代码,如何把散落的数据变成一张实时看板?
  • MyBatis-Plus 的CRUD
  • 第24篇 · 从零到一,我的AI学习之路——复盘与给后来者的建议
  • B站视频下载终极指南:用免费开源的 BilibiliDown,一键把喜欢的视频全部抱回家
  • 告别蓝牙连接翻车:Blueman 蓝牙管理器三步上手指南
  • 半储能系统边缘接入去硬编码化:基于Node-RED流式引擎的免底层开发架构与代码实战
  • 猫抓 Cat-Catch 浏览器资源嗅探扩展:三步抓取网页视频,开源免费不折腾
  • 别再傻等 grep 卡 40 秒:用 KLOGG 日志分析工具三秒搜完 10GB 超大日志
  • 中小企业怎么用得起AI,奇点大会的低成本路径参考
  • Filebeat日志采集与ELK实战指南
  • 题解:瑞学堂 徐老师的零食分享队列
  • 第二篇 STM32MP157-M4:LiteOS-M 源码下载与工程搭建
  • 显卡涨价潮下,8卡RTX5090算力服务器市场前景与技术解析(2026)
  • 告别多套键鼠:用 Input Leap 实现跨设备键鼠共享的 4 步速通指南
  • MP4 文件打不开了?untrunc 视频修复全流程指南
  • ComfyUI中文工作流合集实战指南:50+即用模板,带你零基础快速上手AI创作
  • 办事急用找不到?档案存放证明怎么开?认准**渠道,就能轻松开具! - 实时传讯
  • 2026 线上少儿欧美外教一对一选课指南|5 家主流平台实测对比,避开报课误区!
  • scrcpy 免费投屏完整指南:10 分钟让安卓手机秒变电脑大屏
  • 深圳多家奢侈品回收横向测评,同款香奈儿 CF 报价参差不齐,核心差异一次性讲清 - 拾闻观天地
  • 快速生成 OpenCore EFI:OpCore-Simplify 新手完整上手指南
  • 题解:瑞学堂 徐老师的阶乘计算器
  • 揭秘江阳建设集团网站背后的匠心独运与未来愿景