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选项,如果只能对该库进行静态链接,但是程序不一定整体是静态链接的。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络—HTTPS协议详解:工作原理、安全性及应用实践

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;ヒューマノイド—ずっと真夜中でいいのに。 1:03━━━━━━️&#x1f49f;──────── 5:06 &#x1f504; ◀️ ⏸…

雨云:不只是一阵清风,更是一场暴雨的力量

引言 在网络时代&#xff0c;服务器是任何在线业务的核心。无论你是运营一家小型博客还是承载着数百万用户的大型电商平台&#xff0c;都需要一个稳定、高效的服务器来支持你的业务。然而&#xff0c;在众多服务器提供商中&#xff0c;有一家备受推崇&#xff0c;那就是雨云。 …

electron打包编译国产统信uos系统 arm架构 x86架构 linux mac等环境

electron v21版本以上统信UOS会提示gbm_bo_map错误&#xff0c;可使用v8~v21版本的electron 打包linux包需要再linux系统下运行编译&#xff0c;arch可以指定架构 如果要在统信uos上运行&#xff0c;需要打包成deb格式&#xff0c;在target中修改成deb 或者用第三方软件把app…

数据库设计说明书(Word模板)

2 数据库环境说明 3 数据库的命名规则 4 逻辑设计 5 物理设计 5.1 表汇总 5.2 表结构设计 6 数据规划 6.1 表空间设计 6.2 数据文件设计 6.3 表、索引分区设计 6.4 优化方法 7 安全性设计 7.1 防止用户直接操作数据库 7.2 用户帐号加密处理 7.3 角色与权限控制 8 数据库管理与维…

深入理解Linux系统中的前后台任务与守护进程

⭐小白苦学IT的博客主页 ⭐初学者必看&#xff1a;Linux操作系统入门 ⭐代码仓库&#xff1a;Linux代码仓库 ❤关注我一起讨论和学习Linux系统 1.前言 在Linux系统中&#xff0c;进程管理是至关重要的一个环节。其中&#xff0c;前后台任务和守护进程是进程管理中不可忽视的两…

Intrigue Core:一款功能强大的攻击面枚举引擎

关于Intrigue Core Intrigue Core是一款功能强大的开源攻击面枚举引擎&#xff0c;该工具可以帮助广大研究人员更好地管理应用程序的攻击面。 Intrigue Core集成了各种各样的安全数据源&#xff0c;可以将这些数据提取到标准化的对象模型中&#xff0c;并通过图形数据库跟踪关…

防错设计及原理

目录 1、防错的作用 2、防错的原理 2.1断根原理 2.2保险原理 2.3自动原理 2.4相符原理 2.5顺序原理 2.6隔离原理 2.7层别原理 2.8复制原理 2.9警告原理 2.10缓和原理 防错法&#xff08;Poka-Yoke&#xff09;&#xff0c;又称愚巧法、防呆法&#xff0c;是一种在作…

二叉查找树、二叉搜索树、二叉排序树算法分析及实现

一、几个概念 二叉树&#xff08;Binary Tree&#xff09;&#xff0c;是 n&#xff08;n > 0&#xff09;个结点&#xff08;每个结点最多只有2棵子树&#xff09;的有限集合&#xff0c;该集合或为空集&#xff0c;称为空二叉树&#xff0c;或由一个根节点和两颗互不相交…

如何编译OpenHarmony自带APP

作者&#xff1a;王石 概述 OpenHarmony 的主干代码是开源社区的重要学习资源&#xff0c;对于想进行应用开发和熟悉 OpenHarmony 能力的同学主干代码是非常重要的资源&#xff0c;在主干代码的 applications 目录里聚集了很多原生的应用实现&#xff0c;那么如何编译这些代码…

java:JUnit单元测试

Junit单元测试 介绍 一个用于编写和执行java单元测试的框架,可以帮助开发人员验证代码 单元测试 一种测试方法,用于校验程序中的最小可测试单元(通常是一个方法)是否按照预期工作. JUnit提供了一组注解和断言方法,使编写和执行单元测试变得更加方便 在开发过程中可以频繁…

HarmonyOS开发实例:【菜单app】

简介 分布式菜单demo 模拟的是多人聚餐点菜的场景&#xff0c;不需要扫码关注公众号等一系列操作&#xff0c;通过分布式数据库可以方便每个人可及时查看到订单详情&#xff0c;数量&#xff0c;总额等&#xff1b;效果如下 demo效果 工程目录 完整的项目结构目录如下 ├…

代码随想录第38天| 509. 斐波那契数 70. 爬楼梯

理论基础 刷题大纲&#xff1a; 动态规划5步曲&#xff1a; 1、确定dp数组以及下标的含义 2、确定递推公式 3、dp数组如何初始化 4、确定遍历顺序 5、举例推导dp数组 509. 斐波那契数 509. 斐波那契数 - 力扣&#xff08;LeetCode&#xff09; 代码随想录 (programmercarl.co…

SpringBoot学习笔记二

SpringBoot学习笔记二 1.SpringBoot配置加载顺序1.1 内部配置加载顺序1.2 外部配置加载顺序 2. SpringBoot整合其他框架2.1 SpringBoot整合Test2.2 SpringBoot整合Redis 1.SpringBoot配置加载顺序 1.1 内部配置加载顺序 同理可知&#xff0c;父项目中的confg下的配置优先级最…

Bitmap OOM

老机器Bitmap预读仍然OOM&#xff0c;无奈增加一段&#xff0c;终于不崩溃了。 if (Build.VERSION.SDK_INT < 21)size 2; 完整代码&#xff1a; Bitmap bitmap; try {//Log.e(Thread.currentThread().getStackTrace()[2] "", surl);URL url new URL(surl);…

【数据结构与算法】之8道顺序表与链表典型编程题心决!

个人主页&#xff1a;秋风起&#xff0c;再归来~ 数据结构与算法 个人格言&#xff1a;悟已往之不谏&#xff0c;知来者犹可追 克心守己&#xff0c;律己则安&#xff01; 目录 1、顺序表 1.1 合并两个有序数组 1.2 原地移除数组中所有的元素va…

2024/4/5—力扣—下一个排列

代码实现&#xff1a; 思路&#xff1a;两遍扫描 void swap(int *a, int *b) {int t *a;*a *b;*b t; }void reverse(int *nums, int l, int r) {while (l < r) {swap(nums l, nums r);l;r--;} }void nextPermutation(int *nums, int numsSize) {int i numsSize - 2;wh…

手把手从零搭建ChatGPT网站midjourney-AI绘画系统,附详细搭建部署教程文档

一、系统前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧。已支持…

前端开发攻略---用JavaScript打造炫酷数字变化动画效果:手写实现你的自定义动画函数!支持更改任意数字、动画速度

1、演示 2、介绍 这篇文章将向您展示如何使用JavaScript来创建一个自定义的动画函数&#xff0c;以实现数字变化效果。我们将深入了解前端动画的本质&#xff0c;并通过手写代码来实现这个炫酷的数字变化动画效果。您将学到如何利用JavaScript来操作DOM元素&#xff0c;控制动画…

知名专业定制线缆源头工厂推荐-精工电联:智能制造线缆的前沿技术探索

优质定制线缆源头厂家推荐-精工电联&#xff1a;智能制造线缆的前沿技术探索 知名专业定制线缆源头工厂推荐-精工电联&#xff1a;智能制造线缆的前沿技 在科技飞速发展的当今时代&#xff0c;智能制造已成为工业4.0的核心驱动力。精工电联&#xff0c;作为智能制造领先的高品质…

Pycharm中 Console 打不开

引言&#xff1a; 近年来&#xff0c;越来越多的高校洞察到了Pycharm为代表的编程IDE软件的重要性&#xff0c;已经购买了对应的版权。对于这些软件的使用&#xff0c;许多本科生可能还比较陌生&#xff0c;这系列博客主要总结了一些常见的BUG及对应的解决方案。本篇博客主要总…