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

news2024/11/19 8:47:37

📝个人主页🌹: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.o
	ar -rc $@ $^
%.o:%.c
    gcc -c $<

.PHONY:output
output:
    mkdir -p mymath_lib/include
    mkdir -p mymath_lib/lib                                                                                                                                                                                  
    cp -f *.h mymath_lib/include
    cp -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.o
    gcc -shared -o $@ $^
 
%.o:%.c
    gcc -fPIC -c $<

.PHONY:output
output:
    mkdir -p mymath_lib/include
    mkdir -p mymath_lib/lib
    cp -f *.h mymath_lib/include
    cp -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.coloradmin.cn/o/2177573.html

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

相关文章

Mysql梳理10——使用SQL99实现7中JOIN操作

10 使用SQL99实现7中JOIN操作 10.1 使用SQL99实现7中JOIN操作 本案例的数据库文件分享&#xff1a; 通过百度网盘分享的文件&#xff1a;atguigudb.sql 链接&#xff1a;https://pan.baidu.com/s/1iEAJIl0ne3Y07kHd8diMag?pwd2233 提取码&#xff1a;2233 # 正中图 SEL…

Git 的安装和配置

Git 是跨平台的&#xff0c;可以在 Windows&#xff0c;Linux、Unix 和 Mac 各几大平台上使用 由于笔者主要是使用 Windows&#xff0c;其他平台下安装 Git 的方法暂且不表&#xff08;可参考廖雪峰老师的博客&#xff1a;安装 Git&#xff09; ‍ Windows 安装 Git 从 Git…

【案例73】Uclient无法读取https地址添加应用

问题现象 客户做了一个https的域名转换&#xff0c;网页端是正常访问的&#xff0c;但是在uclient里面添加应用就不行了,出来两个不对的应用&#xff0c;也安装不了&#xff0c;提示失败。 问题分析 点击添加应用发现&#xff0c;本来添加地址是https://域名:外网端口&#x…

【C++报错已解决】std::bad_alloc

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 专栏介绍 在软件开发和日常使用中&#xff0c;BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…

海外媒体投稿:如何运用3种国内外媒体套餐发稿突出重围?

在当今瞬息万变的经营环境中&#xff0c;突出重围营销推广是每家企业都需要思考的问题。为了能突出重围并提升影响力&#xff0c;国内外媒体套餐内容成为了一个非常受欢迎的挑选。下面我们就为大家讲解如何运用三种不同种类的国内外媒体套餐内容来推广突出重围。 2.微博营销新浪…

GIS在构建虚拟世界中的新机遇

地理信息系统&#xff08;GIS&#xff09;技术在构建虚拟世界中扮演着越来越重要的角色。随着数字孪生、虚拟现实&#xff08;VR&#xff09;、增强现实&#xff08;AR&#xff09;和混合现实&#xff08;MR&#xff09;等技术的发展&#xff0c;GIS为虚拟世界提供了地理信息和…

QT开发:基于Qt实现的交通信号灯模拟器:实现一个带有倒计时功能的图形界面应用

介绍 本文将介绍如何使用Qt框架实现一个简单的交通信号灯控制程序。本程序包括一个图形界面&#xff0c;显示红、黄、绿三色信号灯&#xff0c;并通过定时器控制信号灯的切换。同时&#xff0c;我们还将实现一个带有按钮的界面&#xff0c;用于展示信号灯的状态。 1. 安装Qt开…

Linux下的git开篇第一文:git的意义

目录 1.git版本控制器 2.git gitee&&github 3.Linux中gitee的使用 &#xff08; 三板斧 git add git commit -m " " git push &#xff09; 4.git log 查看之前的修改信息 &#xff08;所有提交日志&#xff09; 5.git status 查看工作目录与本地…

三防手机也能实现双卫星通信?智慧应急再添一员猛将!

随着可重复使用运载火箭技术取得显著进展&#xff0c;民营航天快速发展&#xff0c;商业卫星的发射成本不断降低&#xff0c;卫星通信全面普及的时代即将来临。遨游通讯提前布局双卫星通信技术&#xff0c;AORO M5-5G三防手机集成了天通卫星电话与北斗短报文两大国产通信技术。…

怎么将excel表格数据自动生成二维码?批量静态二维码转换的方法

在日常生活中&#xff0c;遇到需要大量二维码制作需求时&#xff0c;比如说需要给同一批产品生成不同编号的二维码时&#xff0c;有什么方法能够快速批量生成二维码呢&#xff1f;如果一个个二维码去制作不仅需要浪费大量的时间&#xff0c;而且也比较容易出错&#xff0c;那么…

MATLAB读取TIF文件,并可视化

在GIS领域&#xff0c;TIF文件则常用于存储地图、地形图等地理空间数据&#xff0c;TIF文件用于地理信息系统时&#xff0c;它通常包含地理坐标、投影信息等地理元数据&#xff0c;这些元数据使得图像能够与地理信息系统无缝集成&#xff0c;便于进行地理定位和分析。 1.读取T…

初始C++模板

1.泛型编程 1.1什么事泛型编程 在学习C语言时&#xff0c;我们时常会有这样的烦恼&#xff1a; 在针对每一种不同的类型变量进行函数传参或者是运算处理时&#xff0c;我们总是编写不同的函数或者是进行不同的处理&#xff0c;才能达到目的&#xff0c;这时&#xff0c;我们…

【JavaEE初阶】深入解析单例模式中的饿汉模式,懒汉模式的实现以及线程安全问题

前言&#xff1a; &#x1f308;上期博客&#xff1a;【JavaEE初阶】深入理解wait和notify以及线程饿死的解决-CSDN博客 &#x1f525;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl-CSDN博客 ⭐️小编会在后端开发的学习中不断更新~~~ &#x1f973;非常感谢你的…

YOLOv8改进 - 注意力篇 - 引入LSKA注意力机制

一、本文介绍 作为入门性篇章&#xff0c;这里介绍了LSKA注意力在YOLOv8中的使用。包含LSKA原理分析&#xff0c;LSKA的代码、LSKA的使用方法、以及添加以后的yaml文件及运行记录。 二、LSKA原理分析 LSKA官方论文地址&#xff1a;LSKA文章 LSKA注意力机制&#xff08;大可分…

胤娲科技:揭秘AI记忆宫殿—LLM如何用动画玩转乔丹打篮球的秘密

当AI遇上“乔丹打篮球”&#xff0c;真相竟然藏在动画里&#xff1f; 想象一下&#xff0c;你向一位AI大模型轻声询问&#xff1a;“迈克尔・乔丹从事的体育运动是……”几乎在瞬间&#xff0c;它就自信满满地回答&#xff1a;“篮球&#xff01;” 这一刻&#xff0c;你是否曾…

ROS理论与实践学习笔记——2 ROS通信机制之服务通信

服务通信也是ROS中一种极其常用的通信模式&#xff0c;服务通信是基于请求响应模式的&#xff0c;是一种应答机制。也即: 一个节点A向另一个节点B发送请求&#xff0c;B接收处理请求并产生响应结果返回给A&#xff0c;用于偶然的、对时时性有要求、有一定逻辑处理需求的数据传输…

电脑usb接口控制软件有哪些?六款软件帮你轻松管控USB端口!

小明&#xff08;疑惑地&#xff09;&#xff1a;“小李&#xff0c;我们公司最近对数据安全特别重视&#xff0c;我听说可以通过软件来控制电脑的USB接口&#xff0c;防止数据泄露。你知道有哪些好用的USB接口控制软件吗&#xff1f;” 小李&#xff08;自信地&#xff09;&a…

双十一买什么好?五大双十一好物推荐!

每年的双十一购物节都是消费者期待已久的盛事&#xff0c;届时各大电商平台纷纷推出优惠活动&#xff0c;吸引了无数购物爱好者的目光。双十一买什么好&#xff1f;为了帮助大家在双十一期间高效购物&#xff0c;我们精心挑选了五大双十一好物推荐&#xff01;这些产品不仅在品…

C++之STL—函数对象谓词

函数对象&#xff08;仿函数&#xff09; 函数对象(仿函数)是一个**类**&#xff0c;不是一个函数 类名&#xff08;&#xff09; 仿函数 直接调用&#xff1a; 、 谓词 定义&#xff1a;返回类型为bool 类型的仿函数 一元谓词&#xff1a;operator()接受一个参数 二元谓词&a…

智能家居新体验:Zigbee2MQTT与Tuya生态的完美结合

01 前言 本文章原文发表于我的微信公众号&#xff0c;请大家关注阅读&#xff0c;涉及的源代码等都在公众号&#xff0c;请搜索公众号&#xff1a; 智能家居NodeRed和HomeAssistant 即可关注。 02 概述 在智能家居领域&#xff0c;Zigbee2MQTT已经成为了许多爱好者和开发者的…