目录

一、认识一下常用指令

1、建立一个软链接

2、建立一个硬链接

3、删除文件的第二种方式:删除链接unlink指令

二、什么是硬链接?

三、软硬链接的原理:

四、应用场景

1、建立一个软链接可以快速在一个比较深的路径中找到目标文件进行执行:

2、观察现象:

3、硬链接使用场景之一:

五、动态库和静态库

1、ldd:查看动态库链接

2、动静态库使用过程

静态库(.a文件)

动态库(.so文件)

3、动静态库注意事项

4、动静态库的制作和使用

(1) $^:所有依赖项列表

(2)$<:第一个依赖项

5、将.c文件链接上动静态库

I(大写i)选项

查看头文件所在路径:ls /usr/inlcude/

6、打包/安装注意事项

7、修改make文件,使动静态库都能形成

8、几个结论

六、理解动态加载

七、简单谈谈编址和可执行程序


前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家

点击跳转到网站

一、认识一下常用指令

1、建立一个软链接

指令:ln -s [源文件或目录] [目标软链接]

软链接即上述的link.soft本质上也是个文件,有独立的inode。

2、建立一个硬链接

指令:

ln [源文件] [目标硬链接]

我们可以观察到两个现象:

(1)硬链接的inode和源文件相同:

所以可以知道硬链接本质不是一个独立文件,因为inode和源文件一样。

(2)我们看一个属性由数字1变成了数字2。

当我们删除硬链接或者源文件,这个数字又会由2变1:

这个属性类似于引用计数,我们称这个属性叫硬链接数

3、删除文件的第二种方式:删除链接unlink指令

该指令和rm类似:

二、什么是硬链接?

由上我们可以知道,硬链接不是一个独立文件,所以创建硬链接的过程并没有创建新文件,硬链接类似于引用计数,只是新的文件名,和源文件的inode号有映射关系。

每增加一组映射,inode结构体中存在一个引用计数就会++,也是就是硬链接数会++。

注意:

三、软硬链接的原理:

四、应用场景

1、建立一个软链接可以快速在一个比较深的路径中找到目标文件进行执行:

因为软链接保存的就是目标文件路径。

2、观察现象:

当我们创建一个文件夹时,硬链接数刚开始默认就是2,为什么呐?

因为创建一个目录的同时会默认创建两个文件

.而当前目录(.)就代表当前目录test1,所以存在两个文件名映射同一个inode,所以test1文件的硬链接数是2。

3、硬链接使用场景之一:

首先认识一个结论:计算一个目录下有多少个子目录:目录硬链接数-2

因为每个子目录都存在一个默认文件(..)代表上级目录,子目录的上级目录就是当前目录。

因为会造成环路问题,所以系统不允许我们为目录创建硬链接:

但系统可以为目录创建硬链接,比如(.)和(..);

五、动态库和静态库

1、ldd:查看动态库链接

  • 左边 libc.so.6 是程序编译、运行时期望找到的动态库 “逻辑名称”(可理解为别名 )。
  • 右边是系统中实际存在的动态库文件路径(物理位置),系统会根据这个映射,在程序加载时找到真实的 libc.so.6 去提供功能支持。
  • 并且编译程序时,默认是进行动态链接,如果想要进行静态链接,需要使用选项“-static" 
  • 动态库后缀:.so
  • 静态库后缀:.a
  • 库的真实名字是去掉前面的lib,去掉后面的后缀(.so/.a)剩下的就是库真实名字,比如上述的libc.so.6真实名字就是c(c标准库)。

2、动静态库使用过程

静态库(.a文件)

  • 编译时 “拷贝整合”:编译链接阶段,链接器会把静态库中被程序调用的代码完整复制到可执行文件里。程序运行时,无需再去外部找库,直接执行内部代码,省去了 “运行时加载库” 的开销,启动速度更快 。
  • 避免运行时动态开销:没有动态加载、符号解析等运行时流程,代码执行流程更直接,对追求极致启动速度和独立运行环境(不依赖外部库)的场景友好,比如嵌入式设备里,程序可脱离外部依赖快速启动执行。

动态库(.so文件)

  • “共享复用” 省资源:多个程序可共享同一份动态库。系统加载动态库到内存后,不同程序调用时,复用已加载的库代码,减少内存、磁盘重复存储(一个库文件给多个程序用,不用每个程序都存一份库代码),提升系统整体资源效率。
  • “延迟绑定” 减启动耗时:借助 PLT(过程链接表)和 GOT(全局偏移表)实现延迟绑定 。程序启动时,不着急解析、绑定所有外部符号(函数 / 变量),第一次调用外部符号时,才去查找地址并记录到 GOT 。后续调用直接用记录的地址,避免启动时 “一次性解析所有符号” 的性能浪费,让程序启动更快,尤其适合依赖多、但实际运行不会用到全部符号的复杂程序。

3、动静态库注意事项

首先为什么要有库?

(1)为了提高效率

(2)可以隐藏源代码

库的本质就是将所有的.o文件用特定的方式进行打包整合,形成一个大文件,最后得到一堆头文件和一个库文件,但这只是简化后的概念,具体还很复杂。

注意:库里面不能含有main函数,因为main只能有一个。

4、动静态库的制作和使用

(1)gcc的-shared选项:用来打包动态库:

(2)gcc的-FPIC选项:

让动态库能被加载到任意内存地址,多个程序可共享同一份库代码(节省内存);避免因库加载地址冲突导致的链接 / 运行错误。

(3)make文件常用符号解析:

(1) $^:所有依赖项列表
  • 含义:表示规则中所有的依赖文件,按书写顺序排列,重复的依赖项会被保留。
  • 示例:若规则为target: file1 file2 file3,则$^等价于file1 file2 file3
(2)$<:第一个依赖项
  • 含义:仅表示依赖项列表中的第一个文件。
  • 示例:上述规则中,$<等价于file1

5、将.c文件链接上动静态库

# 链接动态库
gcc main.o -L./libs -lmylib -o main  # 生成可执行程序 main# 若链接静态库(需确保 libs/ 目录有 libmylib.a)
gcc main.o -L./libs -static -lmylib -o main  # -static 强制静态链接

(1)-L后面接的是库路径,-l后面接的是指定库名

(2)gcc可以默认识别c/c++的库和系统中的路径,所以除了-L指定的路径,gcc还会去系统默认的路径中查找c/c++库。

6、发布库的过程:

I(大写i)选项

查看头文件所在路径:ls /usr/inlcude/

6、打包/安装注意事项

若直接将动态库打包过来安装后用指令编译,虽然编译可以通过,但运行时会报错:(静态库是可以的)

原因如下:

四种解决方法:

(1)

(2)认识一个环境变量:$LD_LIBRARY_PATH:

 Linux里的环境变量,专门用于指定动态链接库(.so 文件,类似 Windows 下的 .dll )的搜索路径。我们将不在系统默认搜索路径下的库路径添加到该环境变量中即可。

跟PATH一致,当重新登录时,会恢复到默认路径。

(3)建立一个软链接

(4)将库路径保存到一个配置文件中

注意事项:

7、修改make文件,使动静态库都能形成

8、几个结论

(1)如果我们同时提供动态库和静态库,gcc默认使用的是动态库;

(2)如果我们非要使用静态库,需要使用static选项

(3)

(4)

六、理解动态加载

1、库默认就是一个磁盘级别的文件,当动态库加载之后,会被映射到进程地址空间的共享区中。

2、

3、

七、简单谈谈编址和可执行程序

八、动态库加载问题

1、详细的可执行程序结构

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VRR(可变刷新率)和QMS(快速媒体切换)

&#x1f527; 一、技术原理的本质区别 技术VRR (可变刷新率)QMS (快速媒体切换)核心目标消除动态帧率波动导致的画面撕裂/卡顿消除静态帧率切换时的黑屏中断工作机制实时调整显示器刷新率&#xff08;Hz&#xff09;匹配GPU输出帧率&#xff08;FPS&#xff09;→ 动态延长/缩…

GO 语言学习 之 Map

map 是 Go 语言中非常重要的数据结构&#xff0c;常用于需要快速查找、统计或分组数据的场景。 map定义&#xff1a; package mainimport "fmt"func main() {var m1 map[int]string // 创建一个 mapm2 : make(map[int]string) // 创建一个 map m3…

什么是可观测性?监控、日志、追踪三者之间有什么区别?

一、引言&#xff1a;为什么现代系统需要“看得见”&#xff1f; 你是否遇到过这样的情况&#xff1a;系统运行突然变慢&#xff0c;但没人知道问题出在哪&#xff1f;随着微服务、云原生架构的普及&#xff0c;系统的复杂度越来越高&#xff0c;传统的“靠经验判断”已经无法…

扣子(coze)实战|自动搬运+改写+归档!自媒体矩阵终极方案

今天给大家分享的是用coze做一个工作流来自动提取抖音/小红书视频文案及改写并传入到飞书多维表格&#xff0c;我们先来看案例 上传视频链接即可一键生成&#xff0c;废话不多说&#xff0c;上教程~ 一、整体工作流如下&#xff1a; 二、开发思路&#xff1a; 三、详细工作流分…

K8s环境下基于Nginx WebDAV与TLS/SSL的文件上传下载部署指南

#作者&#xff1a;闫乾苓 文章目录 1.问题及背景2.方案说明3.部署步骤3.1 制作TLS/SSL私有证书3.2 创建访问nginx账户密码文件并创建secret3.3 为TLS/SSL私有证书创建secret3.4 为Nginx 配置文件创建confimap3.5 使用deployment&#xff0c;svc部署nginx3.6 客户端curl上传下载…

【Day 7-N17】Python函数(1)——函数定义、位置参数调用函数、关键字参数调用函数、函数的默认值

挑战14天学会Python&#xff0c;第7天学习笔记&#xff01;加油&#xff01; 一、概述 函数&#xff08;Function&#xff09;是 Python 中用于封装可重用代码块的基本结构。通过定义函数&#xff0c;我们可以将复杂逻辑拆分为更小、更易管理的单元&#xff0c;并通过参数传递…

STM32 驱动 ADS1015 单端 差分 多通道模式 ADC 转换

文章目录 一、ADS1015简介二、引脚功能三、寄存器介绍1.Conversion Register 转化数据存放寄存器2.Config Register 配置寄存器 四、IIC时序1.写寄存器2.读寄存器 五、程序六、实验现象1.单端模式2.差分模式3.伪多通道模式 一、ADS1015简介 ADS1015 是一款由德州仪器&#xff…

RabbitMQ 消费幂等性与消息重放实现

一、幂等性实现 1.1 什么是幂等性&#xff1f; 幂等性是指同一条消息无论被消费多少次&#xff0c;业务结果都只生效一次&#xff0c;防止重复扣款、重复发货等问题。 RabbitMQ 的投递模式是“至少一次交付”(at-least-once delivery)&#xff0c;如果消费者处理失败或者没有及…

【HarmonyOS 5】鸿蒙TEE(可信执行环境)详解

【HarmonyOS 5】鸿蒙TEE&#xff08;可信执行环境&#xff09;详解 一、TEE是什么&#xff1f; 1、TEE的定义&#xff1a; 可信执行环境&#xff08;Trusted Execution Environment&#xff09;&#xff0c;简称TEE&#xff0c;是存在于智能手机、平板或任意移动设备主处理器…

算法: 冒泡排序

冒泡排序是一种简单的排序算法&#xff0c;通过相邻元素的比较和交换&#xff0c;使较大的元素逐渐"浮"到数组末尾。 时间复杂度:最佳 O(n) | 平均 O(n) | 最差 O(n) 空间复杂度:O(1) 稳定性:稳定 应用场景/前提条件 适用于小规模数据对几乎已排序的数据效率较高…

基于SpringBoot的家电销售展示平台

源码编号&#xff1a;S567 源码名称&#xff1a;基于SpringBoot的家电销售展示平台 用户类型&#xff1a;双角色&#xff0c;用户、管理员 数据库表数量&#xff1a;14 张表 主要技术&#xff1a;Java、Vue、ElementUl 、SpringBoot、Maven 运行环境&#xff1a;Windows/M…

java+vue+SpringBoo智慧旅游系统(程序+数据库+报告+部署教程+答辩指导)

源代码数据库LW文档&#xff08;1万字以上&#xff09;开题报告答辩稿ppt部署教程代码讲解代码时间修改工具 技术实现 开发语言&#xff1a;后端&#xff1a;Java 前端&#xff1a;vue框架&#xff1a;springboot数据库&#xff1a;mysql 开发工具 JDK版本&#xff1a;JDK1.…

Docker 入门教程(三):镜像操作命令

文章目录 &#x1f433; Docker 入门教程&#xff08;三&#xff09;&#xff1a;镜像操作命令获取镜像&#xff1a;docker pull查看镜像&#xff1a;docker images删除镜像&#xff1a;docker rmi搜索镜像&#xff1a;docker search镜像打标签&#xff1a;docker tag镜像详情与…

如何修改discuz文章标题字数限制 修改成255

在 Discuz! X3.5 中&#xff0c;文章&#xff08;主题&#xff09;标题字数的限制可以通过修改数据库结构以及后台配置来实现&#xff0c;以下是完整的修改方法&#xff0c;将标题长度限制改为 255 个字符&#xff1a; ✅ 一、修改数据库字段长度 Discuz 默认标题字段是 subje…

基于BP神经网络的26个英文字母识别

本课题旨在设计并实现一个基于BP&#xff08;反向传播&#xff09;神经网络的英文字母识别系统&#xff0c;实现对手写或打印的26个英文字母&#xff08;A-Z&#xff09;的自动分类识别。项目首先对字母图像进行预处理&#xff08;如灰度化、归一化、二值化和特征提取&#xff…

系统架构设计师论文分享-论云原生技术的应用

我的软考历程 摘要 2023年2月&#xff0c;我所在的公司做了开发纱线MES系统的决定&#xff0c;该系统为国内纱线工厂提供SAAS服务&#xff0c;旨在提高纱线工厂的智能化和数字化水平。我在该项目中被任命为系统架构设计师&#xff0c;全面掌管该项目的架构设计工作。该项目涉…

重置 MySQL root 密码

引言 在linux可能存在安装mysql安装失败&#xff0c;一直不出现默认密码 /usr/local/mysql/mysql-8.0.26/bin/mysqld --defaults-file/etc/my.cnf --usermysql --basedir/usr/local/mysql/mysql-8.0.26 --datadir/usr/local/mysql/mysql-8.0.26/data --lower-case-table-name…

面试八股---HTML

面试八股 1、HTML 1.1 src和href的区别 src 用于替换当前元素&#xff0c;href 用于在当前文档和引用资源之间确立联系。 核心区别在于 href 关联的资源&#xff08;主要是 CSS&#xff09;是用于描述页面外观的&#xff0c;浏览器可以先生成内容再应用样式&#xff0c;因此…

气候智能体:AI如何重构人类应对气候危机的决策体系?

前言 前些天发现了一个巨牛的人工智能免费学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站 《气候智能体&#xff1a;AI如何重构人类应对气候危机的决策体系&#xff1f;》 展开全景式论述。文章结合2025年最新技术突破与…

UITableView的位置向下偏移, contentInsetAdjustmentBehavior使用详情

一.contentInsetAdjustmentBehavior 作用: 在iOS 11及以后&#xff0c;苹果引入了安全区域&#xff08;Safe Area&#xff09;的概念,当UITableView的frame超出了安全区域,系统会自定调整SafeAreaInsets的值,它可以自动调整内容的内边距&#xff0c;使得内容不会被导航栏遮挡。…