Linux:软硬链接及动静态库

一、Linux中的链接文件

1.1硬链接及应用场景

ln//创建硬链接

 我们再创建一个硬链接生成的文件。

我们可以看到mlink.hard的inode和makefile.c的inode都是一样的,inode一样里面的数据自然也是一样。相当于对make.file进行了一个重命名,所以硬链接一定没有新建文件,因为其没有新建inode,所以硬链接新建的是文件名和源文件的inode建立了个映射关系。

也就变成了有两个文件名和一个inode建立了映射关系。

而权限之后的数字就是硬链接数,硬链接本质上就是在指定目录下,插入新的文件名和目标文件的映射关系,并让inode的引用计数,每次创建一个硬链接就++。

可我们可以发现,我们新建的文件默认硬链接数是1,这个1就是路径下的.

 而当我们新创建一个文件夹4.5时会发现硬链接数为2。因为除了自身文件名和inode对应,在此当前目录下包含.文件作为硬链接,链接到自己。


 

此外可以看到,创建了4.5这个目录后,2024.4目录的硬链接数就变为了3,这是因为首先是2024.4指向inode,然后是目录下的.然后还有刚刚创建的4. 5中的.. 

这就是我们cd..可以回到上级目录的原因,因为..作为上级目录的硬链接指向其,inode,我们还可以看到2024.4目录下的..硬链接数为9,~目录的硬链接数为9。

所以一个目录下有多少个子目录,可以通过硬链接数-2得到

注意,Linux中不允许用户给目录建立硬链接,比如在一个目录下建立一个dir硬链接链接到根目录,那我们在寻找查询一个文件的时候查询到dir就会回到根目录形成环路问题,也就是无穷的循环递归现象。除非系统自己建立,只要建立硬链接不管是.还是..都会形成环路问题,而.和..已经被系统做了特殊标识,操作系统会对.和..做特殊处理,而如果让用户自己建立操作系统就无法辨别。

1.2软链接及应用场景

ln -s//建立软链接

mlink.soft本质上是一个文件。

ll -li我们可以看到mlink.soft有自己的inode。

软链接本质就是一个独立的文件,软链接里面放的是目标文件的路径,就类似于windows中的桌面快捷方式。

 软链接可以指向比较深的文件路径,直接./直接就可以运行或操作目标文件。

 可以看到有很多软链接 。

二、动静态库

 2.1什么是动静态库

ldd XXX//查看文件链接哪一个动态库

库被分为两种,动态库(后缀为.so),静态库(后缀为.a)

一般云服务器,都是默认安装动态库,生成可执行程序时也是默认链接动态库。

我们每次生成的可执行程序,都用到了Linux中的C/C++的动态库。 

我们可以通过gcc 文件名 -static 的方式来链接静态库,静态链接的可执行程序的大小是比动态链接的可执行程序是要大很多的。

 一般判断一个库的名字都是去掉前缀lib,去掉后缀so.剩下的就是它的名字,比如libc.so.6去掉前后缀就是c,所以这就是我们的c语言的库。

2.2静态库的制作和使用

所以为什么要有库呢?

1.基于已经实现的库可以提高开发效率

2.隐藏源代码

[root@localhost linux]# ls
add.c add.h main.c sub.c sub.h
[root@localhost linux]# gcc -c add.c -o add.o
[root@localhost linux]# gcc -c sub.c -o sub.o
生成静态库
[root@localhost linux]# ar -rc libmymath.a add.o sub.o 
ar是gnu归档工具,rc表示(replace and create)
查看静态库中的目录列表
[root@localhost linux]# ar -tv libmymath.a 
rw-r--r-- 0/0 1240 Sep 15 16:53 2017 add.o
rw-r--r-- 0/0 1240 Sep 15 16:53 2017 sub.o
t:列出静态库中的文件
v:verbose 详细信息
[root@localhost linux]# gcc main.c -L. -lmymath
-L 指定库路径
-l 指定库名
测试目标文件生成后,静态库删掉,程序照样可以运行

所以库的本质就是把一堆.o打包形成一个文件,然后通过头文件来调用库。注意,库中不能包含main函数。

这里将mymath.o和mystdio.o打包形成名为libmyc.a的静态库,我们可以直接将头文件和.o文件传输给其他人,别人就可以在main函数中进行包含使用,当然如果直接用gcc编译的话会报错,因为gcc默认使用libc.so.6的库,编译器默认去lib64路径下去找库,此时肯定是找不到的。

需要gcc源文件,然后链接自己构造的库,-l链接文件名,-L .表明库文件在当前路径下。然后可以编译成功。

2.3动态库的制作和使用

gcc -c -FPIC文件名//形成同名的.o
gcc -o -shared libXXX.so XXX.o XXX.o//形成名为XXX的动态库

shared: 表示生成共享库格式
fPIC:产生位置无关码(position independent code)
库名规则:libxxx.so
也可以通过makefile文件来进行生成目标文件
补充:$<是将依赖文件依次执行指令。也可以向下面这样写:将所有.c结尾的编译成同名.o 

所以一个编写库的人未来交给别人的

我们也可以通过output将文件创建打包到一个目录下,不同类型的文件打包到不同的子目录下。

之后就可以直接将压缩包mylib.tgz上传转移等操作 ,之后拿到压缩包的人直接进行解压操作就可以拿到文件。

而在直接编译刚刚自己写的第三方库时编译器会进行报错,无法查找到mymath.c。因为编译器在编译时1.默认会到include所在路径下去找2.在当前路径下找,而头文件我们刚刚将其封装在了lib目录下,所以无法查找。

-I就是告诉编译器目标头文件在哪个路径下。

可是这种编译方式及其的繁琐复杂,这时可以采用更好的方式,将include目录和lib目录分别拷贝到include和lib64这样的系统指定的路径中,所以所谓的把库、软件安装到系统中,本质就是将对应的文件,拷贝到系统指定的路径中(一般都是系统)

像类似与stdio.h等都在include路径下。

所以像节省编写时的繁杂操作,我们可以直接将相关文件拷贝到系统指定的路径下。

但编译形成可执行程序后,./去运行发现依然会报错。

因为对于动态库来说:

编译时的搜索路径为gcc

运行时的库搜索路径为os

两个路径可以一样,但对于自定义的库,需要用户即告诉编译器又告诉操作系统。

如果不想每次都手动去链接使用,有以下四种方法来解决:

1.将自定义库和cp拷贝到系统库(/lib64),既可以支持编译又可以支持运行。

2.使用环境变量

系统程序运行时 ,动态库查找的辅助路径,将不在系统默认搜索路径下的库路径,添加到LD_LIBRARY_PATH中。

 3.在系统库下建立软链接

4.通过系统的配置文件路径的方案

推荐第一种和第三种方法,较为方便快捷。

当自定义静态库和动态库都存在且在同一路径下时 ,./运行时优先默认使用动态库。

如果非要静态链接必须使用static选项,如果只能对该库进行静态链接,但是程序不一定整体是静态链接的。

如果只提供动态库,默认只能动态链接,非得静态链接,会发生链接报错。

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

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

相关文章

2023年蓝桥杯省赛——买二赠一

目录 题目链接&#xff1a;1.买二赠一 - 蓝桥云课 (lanqiao.cn) 题目描述 输入格式 输出格式 样例输入 样例输出 样例说明 思路 队列贪心 代码实现 总结 题目链接&#xff1a;1.买二赠一 - 蓝桥云课 (lanqiao.cn) 题目描述 某商场有 N 件商品&#xff0c;其中第 i 件…

漫谈:“标准”是一种幻觉 C++语言标准的意义

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 “标准”这个词很迷惑&#xf…

铸铁平台的单围和双围是什么——北重机械

铸铁平台的单围和双围是指平台的围栏结构。单围指平台只有一面围栏&#xff0c;通常用于平台的三个边界上&#xff0c;另一边是与建筑物相连的。双围指平台两侧围栏都有&#xff0c;即平台四个边界都有围栏。双围结构比单围结构更加安全&#xff0c;可以防止人员和物品从平台四…

CleanmyMac 苹果电脑清理软件,为你的 Mac 提速!

Apple Macbook 已成为当今职场不可或缺的高效助手&#xff0c;尤其在普遍的远程办公场景下&#xff0c;其运行流畅度对工作效率及用户体验至关重要。虽然长期使用会使Mac电脑性能自然衰退&#xff0c;但大部分导致系统变慢的因素其实可经由用户自行调整得到显著改善&#xff0c…

linux 设置命令输入行高亮(与软件无关:xshell等)

在命令执行后输出内容比较多的情况下,很难查看自己的历史命令 这个配置是系统的配置:取消.bashrc文件中force_color_prompt=yes的注释即可 (和连接服务器的软件无关) 具体的操作如下: 执行以下命令,查看配置所在的行数root@hecs-166280:~# cat .bashrc -n | grep force_…

Java Lambda 表达式(详细)

Java Lambda 表达式 Lambda 的发展史 Java Lambda 表达式是在 Java 8 版本中引入的重要特性&#xff0c;它描述了一种更简洁、更灵活的方式来处理函数式编程。 在 Java 8 之前&#xff0c;要实现函数式编程&#xff0c;需要通过匿名类实现接口的方式。这样的代码通常比较冗长…

深入MyBatis的动态SQL:概念、特性与实例解析

MyBatis 是一个优秀的持久层框架&#xff0c;它支持定制化 SQL、存储过程以及高级映射。 MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。它可以使用简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO&#xff0c;即普通的 Java 对象为数据库中的记…

MacOS Docker 部署 Redis 数据库

一、简介 Redis是一个开源的、使用C语言编写的、基于内存亦可持久化的Key-Value数据库&#xff0c;它提供了多种语言的API&#xff0c;并支持网络交互。Redis的数据存储在内存中&#xff0c;因此其读写速度非常快&#xff0c;每秒可以处理超过10万次读写操作&#xff0c;是已知…

milvus search api的数据结构

search api的数据结构 此api的功能是向量相似度搜索(vector similarity search) 一个完整的search例子: 服务端collection是一个hnsw类型的索引。 import random from pymilvus import (connections,Collection, )dim 128if __name__ __main__:connections.connect(alias…

Django检测到会话cookie中缺少HttpOnly属性手工复现

一、漏洞复现 会话cookie中缺少HttpOnly属性会导致攻击者可以通过程序(JS脚本等)获取到用户的cookie信息&#xff0c;造成用户cookie信息泄露&#xff0c;增加攻击者的跨站脚本攻击威胁。 第一步&#xff1a;复制URL&#xff1a;http://192.168.43.219在浏览器打开&#xff0c;…

基于java JSP 实现的固定资产管理系统

开发语言&#xff1a;Java 框架&#xff1a;ssm 技术&#xff1a;JSP JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea 系统展示 前台首页功能模块 固…

Spring: 后端状态码如何与http状态码保持一致

文章目录 一、背景二、解决方案 一、背景 今天使用postman在做接口测试的时候发现了一个有趣的问题&#xff1a;响应体的status和http的status一样&#xff0c;出于好奇对该现象进行了总结。 二、解决方案 通过拦截器ResponseBodyAdvice&#xff0c;做到统一拦截 Controll…

day03 51单片机

51单片机学习 1 模块化编程 1.1 什么是模块化编程 随着我们的代码越来越复杂,我们的main.c越来越长,阅读性也越来越差。如果将来开始做项目,我们可能要同时操作好几个模块,这种情况下我们无法再把代码写到同一个文件,而是要分模块管理代码。 具体实现方法,就是将源码…

三防平板定制服务:亿道信息与个性化生产的紧密结合

在当今数字化时代&#xff0c;个性化定制已经成为了市场的一大趋势&#xff0c;而三防平板定制服务作为其中的一部分&#xff0c;展现了数字化技术与个性化需求之间的紧密结合。这种服务是通过亿道信息所提供的技术支持&#xff0c;为用户提供了满足特定需求的定制化三防平板&a…

YOLOV8 + 双目测距

YOLOV8 双目测距 1. 环境配置2. 测距流程和原理2.1 测距流程2.2 测距原理 3. 代码部分解析3.1 相机参数stereoconfig.py3.2 测距部分3.3 主代码yolov8-stereo.py 4. 实验结果4.1 测距4.2 测距跟踪4.3 测距跟踪分割4.4 视频展示 相关文章 1. YOLOv5双目测距&#xff08;python&…

matlab/simulink仿真全合集---电力电子的simulink仿真

simulink仿真新手大礼包&#xff0c;共整理了9份simulink仿真模型&#xff0c;每一份都是完美运行&#xff0c;适合电气工程专业/电力电子专业的新手学习。 1、Boost电路 simulink 仿真&#xff0c;boost 电路模块搭建和用传递函数进行验证&#xff0c; 电流开环控制 、电流闭…

Jackson(json) 与其他格式数据的转换

目录 第一章、Jackson 介绍1.1&#xff09;Jackson 依赖导入1.2&#xff09;转义字符介绍介绍 第二章、Jackson 与其他格式数据的转换2.1&#xff09;其他数据转为JSON格式数据&#xff08;生成JSON&#xff09;①对象转json&#xff0c;比如我有一个user对象②list转json③map…

内存管理机制SLAB

1. 为什么需要内存分配管理&#xff1f;为什么需要SLAB&#xff1f; 在学习c语言时&#xff0c;我们常常会使用到malloc()去申请一块内存空间&#xff0c;用于存放我们的数据&#xff0c;这是代码层面的语言 如果我们想要关心malloc这个命令向系统发出后&#xff0c;系统会做什…

解决 VSCode 编辑器点击【在集成终端中打开】出现新的弹框

1、问题描述 在 VSCode 的项目下&#xff0c;鼠标右键&#xff0c;点击【在集成终端中打开】&#xff0c;出现新的一个弹框。新版的 VSCode 会有这个问题&#xff0c;一般来说我们都希望终端是在 VSCode 的控制台中打开的&#xff0c;那么如何关闭这个弹框呢&#xff1f; 2、解…

室友打团太吵?一条命令让它卡死

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;更多干货&#xff0c;请关注专栏《网络安全自学教程》 SYN Flood 1、hping3实现SYN Flood1.1、主机探测1.2、扫描端…