【Linux基础IO】Linux IO编程入门:揭秘动态库与静态库的秘密

📝个人主页🌹:Eternity._
⏩收录专栏⏪:Linux “ 登神长阶 ”
🤡往期回顾🤡:Linux Shell
🌹🌹期待您的关注 🌹🌹

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

❀Linux基础IO

  • 📒1. 库的作用
  • 📚2. 静态库
    • 🌞生成静态库
    • ⭐使用动态库
  • 📜3. 动态库
    • 🌞生成动态库
    • 🌸使用动态库
  • 📝4. 动态库加载
  • 📖5. 总结


前言:在Linux的浩瀚编程海洋中,IO(输入/输出)操作作为系统与外界交互的基石,其重要性不言而喻。无论是文件读写、网络通信还是设备驱动,都离不开IO操作的支撑。而在这个过程中,动静态库作为代码复用和模块化的重要手段,扮演着至关重要的角色。它们不仅简化了开发流程,提高了开发效率,还通过优化资源使用和减少编译时间等方式,为Linux程序的性能和可维护性保驾护航

然而,对于许多Linux编程初学者和进阶者而言,动静态库的选择、配置与使用仍然是一个相对陌生且充满挑战的领域。面对琳琅满目的库文件和复杂的链接过程,如何快速上手并有效利用这些资源,成为了摆在他们面前的一道难题

本文旨在成为您学习Linux基础IO中动静态库的得力助手。我们将从最基本的概念出发,逐步深入解析动静态库的原理、区别及适用场景。通过生动的实例和详细的步骤,我们将带您一起探索如何在Linux IO编程中巧妙地运用动静态库

让我们一同踏上这段充满挑战与收获的学习之旅,共同探索Linux基础IO中动静态库的无限可能!


📒1. 库的作用

代码复用:

库提供了可重用的代码集合,这些代码可以在多个程序中共享。通过使用库,开发者可以避免重复编写相同的代码,从而减少开发时间,提高开发效率。代码复用还可以减少因重复编码而导致的错误和漏洞

模块化编程:

库使得模块化编程成为可能。模块化编程是一种将程序划分为独立、可重用的模块或组件的方法。每个模块都封装了特定的功能或数据,并提供了与其他模块交互的接口。通过使用库,开发者可以将复杂的程序分解为更小、更易于管理的部分,从而更容易地进行开发和维护

使用库能极大的简化代码,且具有很多优势,这些优势使得开发者能够更高效地开发软件,提高软件的质量和可维护性

库一般分为:

  • 静态库
  • 动态库

下面我将用两种方式,模拟一个能够加减乘除的库,来方便大家理解

头文件.h

// 为了简化代码,将他们放在一起展示
// Add.h
#pragma once
#include <stdio.h>extern int Add(int x, int y);// Sub.h
#pragma once
#include <stdio.h>extern int Sub(int x, int y);// Mul.h
#pragma once
#include <stdio.h>extern int Mul(int x, int y);// Div.h
#pragma once
#include <stdio.h>extern int Div(int x, int y);

然后我们再编写一个.c文件,将这些声明定义一下,这里就不展示了


📚2. 静态库

静态库(Static Library)是程序设计中用于存储可重用代码和数据的一种文件类型。它们通常是在编译时与程序的其他部分一起被链接到最终的可执行文件中,因此被称为“静态”的,因为它们在程序执行期间不会改变

当我们在上面代码的基础上,如果我们想编译,执行一个文件,在使用上是有点复杂的,我们需要先将它们编译成二进制.o文件,在进行链接,所以我们可以将它们打包成一个文件,然后快速实现我们想要的程序

指令:ldd 可执行文件
可以查看可执行文件的链接状态


🌞生成静态库

指令:ar -rc 静态库 链接的文件

Makefile:

static-lib=libmymath.a
$(static-lib):Add.o Sub.o Mul.o Div.oar -rc $@ $^
%.o:%.cgcc -c $<.PHONY:output
output:mkdir -p mymath_lib/includemkdir -p mymath_lib/lib                                                                                                                                                                                  cp -f *.h mymath_lib/includecp -f *.a mymath_lib/lib.PHONY:clean
clean:rm -rf *.o *.a mymath_lib

在这里插入图片描述
在这里插入图片描述
这样我们就简单生成了一个静态库,那么我们该如何去使用这个静态库呢?,其实只要在编译时,链接库就可以了


⭐使用动态库

在编译时,需要指定静态库文件的位置,以便编译器能够找到并链接它。链接器(Linker)会将静态库中的代码和数据复制到最终的可执行文件中

指令:gcc TestMain.c -I 新增头文件搜索路径 -l链接的库名称 -L 新增库文件搜索路径

-I 指定头文件路径
-L 指定库路径
-l 指定库名
测试目标文件生成后,静态库删掉,程序照样可以运行

注意:-l加上链接的库名称是去掉lib和文件后缀的 (比如libmymath.a ->-lmymath)

在这里插入图片描述
最后我们可以直接运行这个可执行程序


注意事项:

  • 静态库通用于提供基础功能或算法,这些功能或算法在多个程序中都会用到,且更新不频繁
  • 随着模块化编程和动态链接技术的发展,静态库的使用逐渐减少,特别是在需要减小程序体积和共享代码库更新的场景下。
  • 在某些情况下,如嵌入式系统或需要高度安全性的环境中,静态库仍然是首选方案

📜3. 动态库

动态库,又称动态链接库(Dynamic Link Library,简称DLL),在Unix-like系统上称为Shared Object(简称SO),是一种包含可由多个程序同时使用的代码和数据的库文件,动态库可以在多个程序间共享,所以动态链接使得可执行文件更小,节省了磁盘空间。操作系统采用虚拟内存机制允许物理内存中的一份动态库被要用到该库的所有进程共用,节省了内存和磁盘空间


🌞生成动态库

dy-lib=libmymath.so$(dy-lib):Add.o Sub.o Div.o Mul.o TestMain.ogcc -shared -o $@ $^%.o:%.cgcc -fPIC -c $<.PHONY:output
output:mkdir -p mymath_lib/includemkdir -p mymath_lib/libcp -f *.h mymath_lib/includecp -f *.so mymath_lib/lib.PHONY:clean
clean:rm -rf *.o *.so mymath_lib 

shared:表示生成共享库格式
fPIC:产生位置无关码(position independent code)
库名规则:libxxx.so

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


🌸使用动态库

当我们在我们的库文件目录中,同时存在静态库和动态库时,链接器(如gcc的ld)回默认优先使用动态库,如果我们不进行一下操作,虽然可以生成可执行文件,但是文件并不能实现我们的功能,因为它没有正确链接


方法一:直接安装到系统中

直接安装到系统当中,是最推荐的一种方式,也是用的最多的方式,下面我们来演示一下

我们系统文件中会有存放头文件和库文件的地方,我们只需要将我们我们头文件和库文件,拷贝到对应目录下,我们就可以直接使用动态库链接

/usr/include // 头文件
/lib64 // 库文件

在这里插入图片描述

我们将我们自己的文件,安装到了系统文件中,下面我们就可以使用动态库了

在这里插入图片描述


方法二:通过使用软连接,查找动态库

在Linux或Unix系统中,动态库(Dynamic Libraries)通常以.so(Shared Object)文件的形式存在,这些库在程序运行时被加载到内存中,允许程序共享和复用代码。使用软连接(也称为符号链接或symlink)来管理动态库可以方便地更新或替换库文件,而不需要修改依赖于这些库的应用程序

在这里插入图片描述

当然我们也可以直接将软连接安装到系统文件中
在这里插入图片描述


方法三:使用环境变量的方式

在Linux或Unix系统中,环境变量经常被用来指定系统或应用程序查找动态库(.so 文件)的路径。特别是 LD_LIBRARY_PATH 环境变量,它允许用户为动态链接器(dynamic linker/loader)指定额外的库搜索路径

在这里插入图片描述

在这里插入图片描述


方法四:更改系统关于动态库的配置文件

在Linux系统中,更改系统关于动态库的配置文件以查找动态库,主要涉及编辑/etc/ld.so.conf文件或/etc/ld.so.conf.d/目录下的配置文件

先在目录下创建一个文件
在这里插入图片描述

在文件中,保存一下我们库的路径

在这里插入图片描述
运行ldconfig,让更改生效
在这里插入图片描述


使用外部库

系统中其实有很多库,它们通常由一组互相关联的用来完成某项常见工作的函数构成。比如用来处理屏幕显示情况的函数(ncurses库)

使用外部库的本质就是将外部库的头文件和库文件安装到我们的系统目录下,我们就可以使用这个库了


📝4. 动态库加载

在这里插入图片描述

程序没有被加载,程序内部也是有地址的, 变量名,函数名等,编译成为2进制,编译的时候,对代码进行编址,基本遵守虚拟地址空间的那一套虚拟地址空间,不仅仅是OS里面的概念。编译器编译的时候,也要按照这样的规则编译可执行程序,这样才能在加载的时候,进行从磁盘文件到内存,在进行映射,也就是具有了“虚拟地址”,也就是逻辑地址

逻辑地址:基地址 + 偏移量,当基地址从0开始,[0, FFFFFFFF]的时候,这是被称作平坦模式

绝对编址: 简而言之,就是将程序中的每个部分(代码、数据等)按照它们在文件中的顺序,从上到下、从前到后进行连续的编址。这种方式下,程序中的每个元素都有一个唯一的、固定的内存地址,适用于平坦模式

相对编址: 按照与一个参照物的的距离来编址,这种编址方式使得程序在内存中的具体位置具有一定的灵活性,只要保持元素之间的相对位置不变,程序就能正确执行


📖5. 总结

在探索Linux基础IO(输入输出)的旅程中,我们深入了解了动态库(Dynamic Libraries)与静态库(Static Libraries)这一对重要概念,它们不仅是Linux系统编程的基石,也是理解现代软件开发中模块化、复用与性能优化的关键一环

然而,正如硬币的两面,动态库也带来了诸如版本兼容性问题、依赖关系复杂等挑战。因此,在实际开发中,选择使用静态库还是动态库,需要根据项目的具体需求、目标平台的特性以及团队的技术栈等多方面因素综合考虑

总之,Linux基础IO中的动静态库不仅是技术层面的选择,更是对软件开发理念、效率与可维护性之间平衡的深刻体现。随着技术的不断进步,我们期待看到更多创新性的解决方案,能够进一步简化开发流程,提升软件质量,让开发者能够更加专注于业务逻辑的实现,而非被底层技术细节所束缚,愿我们都能在技术的海洋中乘风破浪,不断前行,共同推动软件技术的发展与进步
在这里插入图片描述

希望本文能够为你提供有益的参考和启示,让我们一起在编程的道路上不断前行!
谢谢大家支持本篇到这里就结束了,祝大家天天开心!

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1550116.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

在编写vue3项目过程中,不希望ts校验怎么设置

问&#xff1a; 现在我查询了很多设置 可以看到&#xff0c;设置了很多关闭校验&#xff0c;但是仍然有报错提示&#xff0c;提示当前类型不正确&#xff0c;应该怎么办&#xff1f; 回答&#xff1a; 从其他人的博客中获取灵感&#xff0c;因为vscode的自己的设置了类型检查…

DL_语义分割(学习笔记)

文章目录 图像分割1 常见分类1.1 语义分割1.2 实例分割1.3 全景分割 2 语义分割2.1 模型评价指标2.2 常用数据集2.3 转置卷积2.4 膨胀卷积2.5 感受野2.6 双线性插值2.7 FCN 图像分割 1 常见分类 1.1 语义分割 定义&#xff1a;【只判断类别&#xff0c;无法区分个体】 语义分…

Tableau 瀑布图应用示例

通过探索 10 个示例&#xff0c;将瀑布图的应用拓展到更深层次的业务分析&#xff01; 作为一种直观展示数据变化的图表&#xff0c;瀑布图被广泛应用在业务分析中。同时&#xff0c;借助 Tableau 2024.2 中的 Viz Extensions&#xff0c;如今我们可以快速在 Tableau 中实现瀑布…

【YashanDB知识库】崖山数据库Outline功能验证

本文内容来自YashanDB官网&#xff0c;具体内容请见(https://www.yashandb.com/newsinfo/7488286.html?templateId1718516) 测试验证环境说明 测试用例说明 1、相同版本下&#xff0c;新增表数据量&#xff0c;使统计信息失效。优化器优先使用outline的计划。 2、相同版本下…

CHI trans简介--Retry

总目录&#xff1a; CHI协议简读汇总-CSDN博客 Retry trans flow requester发送一个请求&#xff0c;该请求没有protocol credit(P-Credit); 也就是说&#xff0c;该请求不保证completer一定能够接收该trans;completer返回一个retry resp, RetryAck, 给到Requester;completer再…

逻辑回归(上):函数求导过程自推 LaTex 语法

背景 闲来无事翻了一下之前买的一个机器学习课程及之前记录的网络笔记&#xff0c;发现遇到公式都是截图&#xff0c;甚至是在纸上用笔推导的。重新整理一遍之前逻辑回归函数的学习笔记&#xff0c;主要是为了玩一下 LaTex 语法&#xff0c;写公式挺有意思的。 整理之前三篇笔…

A股收复3000点!外资积极看涨,对冲基金净买入量创三年来新高

9月27日&#xff0c;A股开盘后跳空上涨&#xff0c;连续四天的大幅上涨&#xff0c;9月26日&#xff0c;上证指数收复3000点大关&#xff0c;让一些温州股民感到兴奋不已&#xff0c;一些炒股群里沸腾了。但对于行情走势&#xff0c;股民们产生了分歧&#xff0c;有人是逢高减仓…

SWAP、AquaCrop、FVCOM、Delft3D、SWAT、R+VIC、HSPF、HEC-HMS......

全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型&#xff0c;它综合考虑了土壤-水分-大气以及植被间的相互作用&#xff1b;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程&…

源2.0全面适配百度PaddleNLP,大模型开发开箱即用

近日&#xff0c;源2.0开源大模型与百度PaddleNLP完成全面适配。用户通过PaddleNLP&#xff0c;可快速调用源2.0预训练大模型&#xff0c;使用源2.0在语义、数学、推理、代码、知识等方面的推理能力&#xff0c;也可以使用特定领域的数据集对源2.0 进行微调&#xff0c;训练出适…

爬虫及数据可视化——运用Hadoop和MongoDB数据进行分析

作品详情  运用Hadoop和MongoDB对得分能力数据进行分析&#xff1b;  运用python进行机器学习的模型调理&#xff0c;利用Pytorch框架对爬取的评论进行情感分析预测&#xff1b;  利用python和MySQL对网站的数据进行爬取、数据清洗及可视化。

win10如何禁止指定程序运行?推荐这4个好用的方法,小白必入哦!(轻松拿捏!)

在Windows 10系统中&#xff0c;管理程序运行权限是维护系统安全和提升工作效率的重要手段。 无论是出于防止恶意软件入侵的考虑&#xff0c;还是为了规范员工的软件使用行为&#xff0c;禁止指定程序运行都是一项必备技能。 本文将为您介绍四种简单实用的方法&#xff0c;即便…

校企合作 | 宝兰德与西安航空职业技术学院共筑智慧教育新高地

在教育领域持续变革的今天&#xff0c;智慧教育作为提升教学质量、优化资源配置的关键策略&#xff0c;正逐步成为教育发展的主流趋势。近日&#xff0c;西安航空职业技术学院副校长郭红星、信息中心副主任李畅及主任李永锋等领导莅临宝兰德西安研发中心&#xff0c;双方就智慧…

el-upload不显示进度条

原因&#xff1a;我并没有用el-upload上面的action设置上传url&#xff0c;也没有用他自带的方法上传 这里我使用的是通过自定义接口手动上传&#xff0c;即点击外部按钮&#xff0c;将文件转换后调用接口将文件传参&#xff0c;拿到存储后转换回来的文件url&#xff0c;直接调…

如何处理各行业的DDOS问题

分布式拒绝服务&#xff08;Distributed Denial of Service, DDoS&#xff09;攻击是网络安全领域最为常见且危害性极大的攻击方式之一。通过控制大量计算机、物联网终端或网络僵尸&#xff0c;攻击者能够向目标网站或服务器发送大量请求&#xff0c;从而耗尽其资源&#xff0c…

【docker】如何保存镜像以及分享社区

一、前言 在上篇博客中&#xff0c;我们已经下载了一个nginx的镜像&#xff0c;并且修改了它的内容为“111222”&#xff0c;命名为mynginx&#xff0c;现在我们就要把这个mynginx保存下来&#xff0c;并且分享但我们的docker_hub社区中&#xff01; 二、保存镜像 1、常用命名…

Vision Mamba UNet:一种新型医学图像分割网络

人工智能咨询培训老师叶梓 转载标明出处 在医学图像分割的研究中&#xff0c;卷积神经网络&#xff08;CNN&#xff09;与变换器&#xff08;Transformer&#xff09;模型各有其优势和局限。CNN由于其有限的局部感受野&#xff0c;在捕获长距离信息时能力较弱&#xff1b;而尽…

深入理解 Nuxt.js 中的 app:data:refresh 钩子

title: 深入理解 Nuxt.js 中的 app:data:refresh 钩子 date: 2024/9/29 updated: 2024/9/29 author: cmdragon excerpt: 摘要:本文详细介绍了 Nuxt.js框架中的app:data:refresh钩子,包括其定义、用途、使用方法及实际应用案例。该钩子用于在数据刷新时执行额外处理,支持…

这几个高含金量证书,网工真的该拿

在这个技术日新月异的行业中&#xff0c;不断学习新技能和知识是保持竞争力的关键。 而证书&#xff0c;作为一种专业能力的认证&#xff0c;不仅能够证明你的技术实力&#xff0c;还能为你打开更多的职业发展大门。 在众多的IT认证中&#xff0c;有些证书因其高含金量而备受推…

推动国产化软件飞跃:三品软件与麒麟完成兼容性验证 共筑数字强国梦

近日&#xff0c;三品软件产品全生命周期管理系统(PLM)V1.0与麒麟软件成功完成了兼容性适配认证&#xff0c;这标志着我司在推进国产化创新发展进程中取得实质性的进展。 三品软件的PLMV1.0是一款全面的产品生命周期管理平台软件产品&#xff0c;集成设计、研发、生产管理等环…

Python编码系列—Python状态模式:轻松管理对象状态的变化

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…