Linux中的动态库与静态库

news2025/2/27 2:49:05

文章目录

  • 软链接与硬链接
  • 动态库与静态库
    • 静态库
    • 动态库
  • 动静态库的区别

软链接与硬链接

软链接

当我们不在本地路径下运行时,运行目标二进制文件一般要写明该程序路径.
在这里插入图片描述
但是这样运行对于路径较为复杂的程序极为耗费时间,为了简便操作,我们可以将该可执行程序的路径设置为软链接.此时的软链接一般也可认为是windows可执行程序的快捷方式.

创建软链接命令如下:

[yzh@VM-4-5-centos ~]$ ln -s /home/yzh/my.exe mysoft

在这里插入图片描述
注意:
创建软链接不能将可执行程序的路径写错了,不然运行该程序会出错.

硬链接

硬链接指在指定的目录下,建立文件名与目标inode文件的映射关系,一般默认为"取别名".

创建硬链接命令如下:

[yzh@VM-4-5-centos ~]$ ln /home/yzh/my.exe myhard

在这里插入图片描述

硬链接的用途

我们知道,inode中还有一个引用计数,它代表文件名与目标文件关联的个数.

  • 当我们创建一个硬链接,代表多了一个文件名与目标文件相关联,引用计数+1.
  • 当我们删除一个硬链接,代表少了一个文件名与目标文件相关联,引用计数-1.
  • 当引用计数减少为0时,代表没有文件名与目标文件相关联,进而代表该文件被真正删除.

删除链接关系命令:

[yzh@VM-4-5-centos ~]$ unlink myhard

在这里插入图片描述

延申问题

当我们创建一个空目录时,为什么该文件的引用计数为2呢?
在这里插入图片描述
因为自身的目录名与自身内部的 " . " ,都和同一个文件的inode具有映射关系.其中" . " 也代表着当前目录(也就是我们所在的目录).
在这里插入图片描述
再比如: 当我们在ceshi目录内创建一个ceshi1目录,进入该目录,使用ll -ail 目录查看,发现 该目录下的 "…“与ceshi目录的inode相同,说明”…"与ceshi目录也建立了映射关系.其中 "…"也代表着上一级目录.

在这里插入图片描述
所以,我们可以通过目标目录的引用计数-2(自身对应关系以及下一级目录下的 “.”),来判断该目录中所存在的下一级目录个数了(也代表着下一级目录中"…"的个数).

软硬来链接的区别

当我们查看创建的软硬链接,区别如下:

  • 软链接有独立的inode,说明软链接是一个独立的文件.
  • 硬链接没有独立的inode,说明硬链接不是一个独立的文件.
    在这里插入图片描述

动态库与静态库

为了便于理解,我们创建了两个源文件与两个头文件,这些文件只为用以动静态库的相关操作.

mymath.c

累加到目标值.

#include "mymath.h"                                                                                            
int addToTarget( int form,int to )
 {
           int sum = 0;
 
           for( int i = form; i <= to; ++i )
            {
              sum += i;
            }
            return sum;
 }

mymath.h

 #pragma once
 #incldue <stdio.h>
 extern int addToTarget( int from, int to );

myprint.c

打印所给字符串以及时间戳.

#include "myprint.h"
void Print( const char* str )
{
   print("%s[%d]\n",str,(int)time(NULL));
}

myprint.h

#pragma once
#include <time.h>
extern void Print( const char* str);

main.c

调用myprint以及mymath相关库.

#include "myprint.h"                                                                                                #include "mymath.h"
int main()
  {
    Print("hello world\n");
    int res = addToTarget(1,100);
    printf("%d\n",res);
    return 0; 
 }

静态库

生成静态库

1.将所有源文件生成二进制文件.(不可执行).
在这里插入图片描述

2.使用rc命令,将这些二进制文件统一打包为静态库.

  • -r(replace): 如果创建的目标文件与静态库文件名相同,则将新的静态库文件替换掉重名的静态库文件.
  • -c(create): 创建静态库.
    在这里插入图片描述
    3:将静态库中头文件与静态库统一放在指定目录中.
    在这里插入图片描述

当然,为了简便以上操作,我们也可以采用使用Makefile统一生成.
在这里插入图片描述
使用make,makeoutput命令同意生成并打包静态库.
在这里插入图片描述

静态库的使用

方法一: 利用sudo cp命令分别将头文件复制在: /usr/include ,静态库文件复制: /lib64.
在这里插入图片描述
但是使用gcc命令编译链接成打可执行程序时,需要指明编译的库.(库名去点前后缀即可) 例如: libhello.a --> hello.
在这里插入图片描述
方法二:直接指明头文件,静态库文件的路径,并让编译器在指定路径下搜索.
编译命令如下:

gcc main.c -I ./output/include/ -L ./output/lib -lhello
  • -I: 表示指明头文件搜索路径.
  • -L: 表示指明库文件搜索路径
    在这里插入图片描述

动态库

动态库的生成

方法一:

第一步:先将源文件统一编译为二进制文件(不可执行).

gcc -fPIC -c mymath.c -o mymath.o -std=c99
gcc -fPIC -c myprint.c -o myprint.o -std=c99

在这里插入图片描述
第二步: 使用gcc -shared命令所有目标文件打包生成动态库库

gcc -shared myprint.o mymath.o -o libhello.so

在这里插入图片描述

第三步: 将头文件与静态库统一放在指定目录中

我们选择将.h头文件放在output目录下的include中,将动态库.so文件放在include目录下的lib目录中.
在这里插入图片描述
方法二: 使用Makefile统一打包生成.

我们将打包生成动静态库的所有命令写入Makefile中,使用Makefile命令统生成动静态库.
在这里插入图片描述
在这里插入图片描述

动态库的使用

与动态库的使用不同的是,我们使用gcc -I -L -l编译链接产生的可执行程序不可以直接运行.
在这里插入图片描述
原因:我们在gcc 使用 -I -L 表明动态库的路径时,是对gcc编译器说的,当我们要运行加载程序的时候,此时已经生成了可执行程序,跟gcc没有任何关系,但是要运行时,进程需要通过->虚拟地址空间->页表映射去寻找动态库的位置,所以我们要对Linux系统表明动态库的位置.,静态库不需要将库的地址告诉操作系统是因为静态库在加载的时候已经将代码加载到内存中了,不需要再去与操作系统建立映射关系查找.

方法一: 增加环境变量

由于LD_LIBRARY_PATH是进程运行动态库时所要搜索的路径,我们需要将动态库的路径添加到LD_LIBRARY_PATH环境变量即可.

在LD_LIBRARY_PATH 环境变量中使用export加动态库的绝对路径,使用达echo命令查看环境变量是否成功添加.

[yzh@VM-4-5-centos userlib]$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/yzh/userlib/output.lib

在这里插入图片描述

方法二: 配置 /etc/ld.so.conf,d/ 文件

第一步: 在/etc/ld.so.conf,d/目录中创建一个文件(后缀一定要是.conf)

[yzh@VM-4-5-centos userlib]$ sudo vim /etc/ld.so.conf.d/yzh.conf

在这里插入图片描述
在该文件中加入动态库的路径.
在这里插入图片描述
之后再使用 sudo ldconfig命令将/etc/ld.so.conf.d/下的目录文件更新就可以了.
在这里插入图片描述
方法三: 设置软连接

将动态库的路径设置为路径为 /lib64/下的软链接,在设置软硬接中最好表明的是动态库的绝对路径,否则系统系统会找不到动态库。

[yzh@VM-4-5-centos userlib]$ sudo ln -s /home/yzh/userlib/output/lib/libhello.so /lib64/libhello.so

在这里插入图片描述
此时,我们使用 ls /lib64 查看软链接是否建立.
在这里插入图片描述

动静态库的区别

  • 静态库使用时是将可执行程序加载到内存中后通过页表映射到地址空间的代码区中,并且每一个进程运行该程序都会将该程序反复加载到内存中,极大浪费了内存空间.

  • 动态库可以和可执行程序进行分批加载,当进程运行到可执行程序中的动态库时,进程会将动态库加载到内存中,内存通过页表进行映射到地址空间中栈堆之间的共享区,当进程执行到动态库时,会从代码区跳转到共享区执行,当有多个进程时运行该可执行程序的动态库时,此时加载到内存中的动态库共享到每个进程,所以动态库也称为共享库.
    在这里插入图片描述

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

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

相关文章

SQL函数和高级语句

目录 一、常用函数 1.聚合函数 2.数学函数 3.字符串函数 二、sql高级语句 1. SELECT&#xff08;显示表格中指定字段或所有记录&#xff09; 2.DISTINCT&#xff08;不显示指定字段数据重复的记录&#xff09; 3.WHERE&#xff08;指定条件查询&#xff09; 4.AND、OR…

(五)「消息队列」之 RabbitMQ 主题(使用 .NET 客户端)

0、引言 先决条件 本教程假设 RabbitMQ 已安装并且正在 本地主机 的标准端口&#xff08;5672&#xff09;上运行。如果您使用了不同的主机、端口或凭证&#xff0c;则要求调整连接设置。 获取帮助 如果您在阅读本教程时遇到问题&#xff0c;可以通过邮件列表或者 RabbitMQ 社区…

【树链+EXGCD】杭电多校第一场 A

1001 Hide-And-Seek Game (hdu.edu.cn) 题意&#xff1a; 给定一棵树和两条路径&#xff0c;每条路径都有起点和终点&#xff0c;起始时起点有人&#xff0c;每隔一秒都会往终点走一步&#xff0c;会从起点走向终点再会起点这样不断地周期性地走&#xff0c;让你求一点&#…

线上 OOM 频发,MyBatis 有坑...

继上次线上 CPU 出现了报警&#xff0c;这次服务又开始整活了&#xff0c;风平浪静了没几天&#xff0c;看生产日志服务的运行的时候&#xff0c;频繁的出现 OutOfMemoryError&#xff0c;就是我们俗称的 OOM&#xff0c;这可还行&#xff01; 频繁的 OOM 直接会造成服务处于一…

编程小白的自学笔记十(python爬虫入门二+实例代码详解)

系列文章目录 编程小白的自学笔记九&#xff08;python爬虫入门代码详解&#xff09; 编程小白的自学笔记八&#xff08;python中的多线程&#xff09; 编程小白的自学笔记七&#xff08;python中类的继承&#xff09; 编程小白的自学笔记六&#xff08;python中类的静态方法…

pandas 笔记:pivot_table 数据透视表

1 基本使用方法 pandas.pivot_table(data, valuesNone, indexNone, columnsNone, aggfuncmean, fill_valueNone, marginsFalse, dropnaTrue, margins_nameAll, observedFalse, sortTrue)2 主要参数 dataDataFramevalues要进行聚合的列index在数据透视表索引&#xff08;index…

flask基本用法小白教程+按钮跳转到指定页面+python和pip安装(后附)

一、flask学习教程&#xff1a; 1.1 基本程序&#xff1a; 大家可以在pycharm中复制如下代码&#xff0c;先感受一下flask的基本用法&#xff1a; 点击链接可进入浏览器查看程序运行的结果&#xff0c;在127.0.0.1:5000后面添上/test1/等设定的文字&#xff0c;可查看不同函…

Python生成exe文件运行出现黑框闪退如何查看运行bug?

cmd进行回车 第一&#xff1a;进入到可执行exe文件目录&#xff0c;如下图所示 第二&#xff1a;输入可执行文件名&#xff0c;然后就会出现报错提示

(转载)BP神经网络的非线性系统建模(matlab实现)

1案例背景 在工程应用中经常会遇到一些复杂的非线性系统,这些系统状态方程复杂,难以用数学方法准确建模。在这种情况下,可以建立BP神经网络表达这些非线性系统。方法把未知系统看成是一个黑箱,首先用系统输入输出数据训练BP神经网络,使网络能够表达该未知函数,然后用训练好的 B…

【外卖系统】环境的搭建

搭建数据库 1.创建数据库&#xff0c;名字叫reiggie 2.导入数据库 创建Maven项目 1.创建项目 2.检查项目新建的是否有问题 3.导入pom.xml文件 4.导入application.yml文件 在从gittee上down的代码的基础上&#xff0c;修改一下端口号&#xff0c;数据库的名称什么的 …

(数组与矩阵) 剑指 Offer 29. 顺时针打印矩阵 ——【Leetcode每日一题】

❓ 剑指 Offer 29. 顺时针打印矩阵 难度&#xff1a;简单 输入一个矩阵&#xff0c;按照从外向里以顺时针的顺序依次打印出每一个数字。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,5] 示例 2&#xff1a; 输…

DP转HDMI方案芯片-CS5218/CS5263/CS5363/CS5463详细参数对比说明

CS5218/CS5263/CS5363/CS5463都可用于设计DP转HDMI转接线方案&#xff0c;但几者间不管封装还是功能参数都有差异&#xff0c;如下介绍对比下&#xff1a; CS5218 DP to HDMI(4K30HZ) &#xff0c;CS5218管脚定义参数说明和设计电路图&#xff1a; ​ ​ CS5263 DP to HDMI 4…

Kubernetes_1.27.3_Harbor结合Nacos实战

Nacos 实战 作者:行癫(盗版必究) 一:Nacos简介 1.简介 ​ Nacos是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台;Nacos 致力于帮助您发现、配置和管理微服务;Nacos 提供了一组简单易用的特…

计讯物联5G千兆网关TG463在电力智能巡检机器人的应用功能解析

项目背景 随着国家智能电网建设加速推进&#xff0c;投资规模持续扩大&#xff0c;我国电网智能化、信息化不断提高&#xff0c;传统的电力运维与管理模式早已不能满足智能电网快速发展的需求。因此&#xff0c;在5G无线通信、人工智能、物联网、云计算、大数据、电力等前沿技术…

Error: The client is unauthorized due to authentication failure.解决办法

进入到neo4j的安装目录 修改neo4j.conf配置文件 把红框的注释#去掉保存后&#xff0c;重新运行neo4j,问题解决

【Python统计与数据分析实战_01】位置与分散程度的度量

数据描述性分析 1.描述统计量1.1 位置与分散程度的度量1.1.1 例子一 单维数组1.1.2 例子二 多维数组 1.2 关系度量1.3 分布形状的度量1.3.1 统计量&#xff1a;偏度和峰度 1.4 数据特性的总括 1.描述统计量 数据的统计分析分为统计描述和统计推断两部分。前者通过绘制统计图、…

Vue3.0的设计目标是什么?做了哪些优化?

一、设计目标 不以解决实际业务痛点的更新都是耍流氓,下面我们来列举一下Vue3之前我们或许会面临的问题 随着功能的增长,复杂组件的代码变得越来越难以维护 缺少一种比较「干净」的在多个组件之间提取和复用逻辑的机制 类型推断不够友好 bundle的时间太久了 而 Vue3 经过长达…

RuoYi-Vue/vue项目访问 webpack 中定义的变量

前言 RuoYi-Vue 3.8.4 webpack 中定义的变量 vue.config.js 中定义的 webpack 的变量 在html页面中&#xff0c;如何访问 webpack 的变量 <title><% webpackConfig.name %></title>参考&#xff1a;ruoyi-ui/public/index.html 文件

【分布式训练】基于Pytorch的分布式数据并行训练

基于Pytorch的分布式数据并行训练 动机为什么要并行分布数据&#xff1f;现有资料的不足 Outline整体框架图带解释的最小demo示例没有multiprocessing开启multiprocessing 分布式训练启动方式混合精度训练&#xff08;采用apex&#xff09; 参考资料 简介&#xff1a; 在PyTorc…

一则 MySQL 参数设置不当导致复制中断的故障案例

本文分享了一个数据库参数错误配置导致复制中断的问题&#xff0c;以及对参数配置的建议。 作者&#xff1a;秦福朗 爱可生 DBA 团队成员&#xff0c;负责项目日常问题处理及公司平台问题排查。热爱互联网&#xff0c;会摄影、懂厨艺&#xff0c;不会厨艺的 DBA 不是好司机&…