【Linux--基础IO(动静态库)】】

news2025/4/13 14:25:20

动态库和静态库

静态库与动态库

静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候不再需要静态库。
动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。
一个与动态链接的可执行文件仅仅包含他用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码。
在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个过程称为动态链接(dynamic linking)
动态库可以在多个程序间共享,所以动态链接使得可执行文件更小,节省了磁盘空间。操作系统采用虚拟内存机制允许物理内存中的一份动态库被要用到该库的所有进程公用,节省了内存和磁盘空间。
一般云服务器,默认只会存在动态库,静态库需要单独安装。

静态库

作为库的分享者
现在我们分别建立下面几个文件,并编写程序。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

现在为了模拟其他人来使用我们自己打包好的库的动作,我们把这些文件分别放到了mylib和otherPerson里
在这里插入图片描述
如果我们不想要其他人看到我们程序具体方法的实现,我们可以交付我们编译好的.o和.h文件,让对方在知晓我们方法的前提下,又实现了保密。

执行gcc -c,完成预处理、编译、汇编生成可重定位二进制目标文件(.o文件)。
在这里插入图片描述
把.h和.o文件都复制到otherPerson文件夹
在这里插入图片描述
首先编译自己的main.c
在这里插入图片描述
然后一起链接
在这里插入图片描述
可以看到最后我们就在没有.c文件的otherPerson文件夹里成功调用了我们自己编写的myadd和mysub文件并运行。

然后我们将生成的.o文件打一个包。(前缀lib,后缀.a,但是真实名字是·mymath)
在这里插入图片描述

那么如何使用呢?

作为库的使用者

第三方库的使用
1、需要指定的头文件和库文件
2、如果没有默认安装到系统gcc,g++默认的搜索路径下,用户必须指明对应的选项,告知编译器:a、头文件在哪里 b、库文件在哪里 c、库文件名字。
3、将我们下载下来的库和头文件,拷贝到系统默认路径下–在Linux下安装库!
4、如果我们安装的库是第三方的(第一方:语言、第二方:操作系统接口),我们要正常使用,即使是已经全部安装到了系统中,gcc/g++必须用-l来指明具体库的名称!


__方法一:__没有默认安装到系统gcc,g++默认的搜索路径下,用户必须指明对应的选项,告知编译器:a、头文件在哪里 b、库文件在哪里 c、库文件名字。

gcc -选项
-L 指定库路径
-l 指定链接的库名

在这里插入图片描述
我们可以看到上图在只有.h 和静态库的情况下,我们仍然成功运行了程序。

现在我们来真实模拟一下,在网络上下载了压缩文件之后该怎么使用。
在这里插入图片描述
1、解包
在这里插入图片描述
2、编译
在这里插入图片描述

对任何软件而言,安装和卸载的本质就是拷贝到系统特定的路径下

但是回想一下,我们以前在c/c++语言学习过程中对标准库(比如stdio)的调用。对比起来是不是我们自制的库的使用过程还是比较繁琐。所以我们进一步进行下一步操作,不需要我们自己指明搜索路径,只要我们将我们的库文件以及头文件拷贝到库默认的搜索路径下即可。

__方法二:__没有默认安装到系统,通过复制将文件安装到搜索路径下
在这里插入图片描述
然后直接gcc,成功运行。
在这里插入图片描述

动态库

shared:表示生成共享库格式
fPIC:产生位置无关码(position independent code)
库名规则:libxxx.so

作为库的分享者

1、预处理、汇编、编译生成.o文件和位置无关码
在这里插入图片描述
2、将.o文件打包生成.so
在这里插入图片描述
在这里插入图片描述
3、压缩并上传
在这里插入图片描述

作为库的使用者

1、解包
在这里插入图片描述
2、编译
然后按照静态库的使用方法直接编译,会发现我们即便是在指定了头文件路径,库路径,库名称之后仍然无法成功链接。那么就不得不提到静态库和动态库的区别了。
在这里插入图片描述

  • 静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候不再需要静态库。
  • 动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。

我们使用ldd来打印程序或者库文件所依赖的共享库列表。
在这里插入图片描述
3、运行
临时
可以发现动态库not found。所以接下来我们需要让系统能够搜索到我们的动态库。
在这里插入图片描述
在这里插入图片描述
此时我们就可以找到动态库,然后运行程序了。
我们这种方法是临时修改了环境变量,当我们再次进入时候,配置文件里还是没有,所以是临时的

永久–软连接
通过在系统中指定的系统路径下建立软链接指向我们的库,系统就可以直接加载我们的库了。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
由于软连接是一个正常的、在磁盘上可以永久存在的文件,当我们重新登录的时候,仍然存在,所以是永久的

永久–配置文件
1、在/etc/ld.so.conf.d/路径下创建maria.conf文件,其文件内容为动态库所在的绝对路径(即 /home/mr/lesson19/otherPerson/lib/)
2、执行ldconfig(需要sudo提权),更新

在这里插入图片描述

动态库必定面临一个问题:不同的进程,运行程度不同,需要使用的第三方库是不同的。注定了,每一个进程的共享空间中的空闲位置是不确定的。所以动态库中的地址绝对不能使用绝对编址。都是偏移量。(位置无关码)

注意:
1、编译器,在链接的时候,如果提供的库既有动又有静,优先动;只有静,只能静
2、动态库和静态库同时存在,系统默认采用动态链接
3、 云服务器一般只会提供动态库。

在这里插入图片描述

最后祝我生日快乐❤

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

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

相关文章

对抗物联网网络威胁

物联网 (IoT) 技术的快速发展以多种方式改变了世界。从家庭自动化到工业控制系统,物联网已成为我们日常生活中不可或缺的一部分。 然而,与任何新技术一样,随之而来的是重大的网络安全问题。在这篇博文中,我们将探讨物联网网络安全…

Linux网络编程—Day9

今天!我们来学习新的章节——I/O。 Linux提供了很多高级的I/O函数。它们并不像Linux基础I/O函数 (比如open和read)那么常用,但在特定的条件下却表现出优秀的性能。我们学习下和网络编程相关的几个,这些函数大致分为三…

二、注册中心与服务调用-Nacos

文章目录 二、注册中心与服务调用1、Nacos概述1.1 什么是Nacos1.2 常见的注册中心1.3 Nacos结构图1.4 Nacos下载和安装 2、注册服务2.1 Nacos注册service-hosp 二、注册中心与服务调用 目前在医院列表中需要医院的信息和等级信息,而两段信息属于不同的的模块,service-hosp和se…

【自然语言处理】- 作业4: 预训练语言模型BERT实现与应用

课程链接: 清华大学驭风计划 代码仓库:Victor94-king/MachineLearning: MachineLearning basic introduction (github.com) 驭风计划是由清华大学老师教授的,其分为四门课,包括: 机器学习(张敏教授) , 深度学习(胡晓林教授), 计算…

Leetcode—回溯算法

​ 回溯算法的本质 是穷举,穷举所有可能,然后选出合适的答案,一般用于解决以下类型的问题: 组合问题:N个数里面按一定规则找出k个数的集合切割问题:一个字符串按一定规则有几种切割方式子集问题&#xf…

Day4——数据库基础1

Day4——数据库基础 数据库基础--基于phpstudy自带的MySQL数据库(下载了PHPstudy后就无需下载额外的MySQL) 一、数据库概念1、为什么要学习数据库?2、什么是数据库?3、数据库的访问方式4、数据管理技术经历的三个阶段5、关系型数据…

Three.js深度冲突(模型闪烁)与解决方案

Mesh面重合渲染测试 下面代码创建两个重合的矩形平面Mesh,通过浏览器预览,当你旋转三维场景的时候,你会发现模型渲染的时候产生闪烁。 这种现象,主要是两个Mesh重合,电脑GPU分不清谁在前谁在后,这种现象&a…

Debug | Litemall项目上线

文章目录 1. litemall资源1.1 Litemall项目开源网址1.2 Litemall网盘地址 2. 项目上线2.1 项目框架2.2 项目配置2.3 依赖工具安装2.4 数据库导入2.5 启动小商城和管理后台的后台服务2.6 启动管理后台的前台服务 3项目展示: 1. litemall资源 1.1 Litemall项目开源网…

webpack 自定义loader

文章目录 项目目录搭建项目my-raw-loader参数schema-utils tpl-loader 项目目录 让我们实现一些简易的loader,从大量的简易loader的实现过程中学习编写如何 webpack loader ├── loaders # loader目录 ├── src …

数据库sql语句-----游标和存储过程

关键词: create procedure xxx()as.......go 查询: exec ... 从例子中感悟一下: create table cartoon( linenum int, name varchar(50) not null, line varchar(100) not null )insert into cartoon values(1,灰太…

基于SpringBoot+Vue+MybatisPlus的智慧校园系统

智慧校园系统 1. 项目简介2. 项目模块3. 技术栈4. 软件环境4.1 安装数据库4.2 安装数据库客户端Navicat工具4.4 安装IDEA4.4 安装Maven 5. 系统页面5.1 首页登录页5.2 系统功能模块5.3 Swagger2接口文档查阅5.4 运行截图 6. 源代码下载 1. 项目简介 智慧校园管理系统是一个基于…

从零开始Vue3+Element Plus后台管理系统(十三)——富文本编辑器、Markdown编辑器、代码编辑器

早就想着要放几个编辑器的Demo到项目中,这也是项目开始就立下的flag。 今天专门挑选了几款主流编辑器,包括绕不开的富文本编辑器,码农最爱的markdown编辑器,还有用途相对少的代码编辑器。 时间有限的情况下,仅引入4个…

去哪儿酒店数据下载

字段内容包含: id int(11) NOT NULL AUTO_INCREMENT, hotelid varchar(50) DEFAULT NULL, url varchar(200) DEFAULT NULL, hotelname2 varchar(100) DEFAULT NULL, name varchar(100) DEFAULT NULL, province varchar(50) DEFAULT NULL, d…

zabbix安装完成后,无法找到zabbix/bin目录

问题 zabbix安装完成后,无法找到zabbix/bin目录 详细问题 笔者安装zabbix后,自定义item key进行测试。需在zabbix-server 端 切换目录: cd /usr/local/zabbix/bin 执行查询命令: ./zabbix_get -s 192.168.174.132 -p 10050 -k …

Bat批处理中的 FINDSTR用法

linux中的grep等同于win中的findstr命令。可以在txt文本中截取到有特定关键字的行,并显示出来。 grep也可以通过关键字,在一个文件夹下查找多个有这些关键字的文件,并生成结果。 一、findstr命令介绍 findstr是Windows系统自带的命令,简单来说…

chatgpt赋能Python-python_end的用法

简介 Python是一种广泛使用的编程语言,被广泛应用于数据科学,机器学习,网络编程,Web开发等领域。Python内置了许多有用的操作符和关键字,其中包括end。end是Python中一个非常有用的操作符,它可以在将多个输…

C001--Visual C++ 6.0集成开发环境的下载与安装并运行简单的C语言程序

visual c的下载安装过程不复杂,只需要运行setup.exe程序,然后按照安装程序的提示信息进行操作,也可以指定系统文件存放的路径。 目录 一,下载安装集成开发环境 1,流程 2,熟悉visual c工作界面 二&am…

Element-UI介绍:主题定制、自定义组件和插件扩展

部分数据来源:ChatGPT 什么是Element-UI Element-UI是一款简单好用的前端UI库,基于Vue.js开发。它提供了常用的组件和样式,可以帮助我们快速地构建美观、实用的交互界面。 在使用Element-UI开发项目过程中,我们有时遇到了一些特…

chatgpt赋能Python-python_dim

Python dim:将维度降至极致 在机器学习和数据分析领域,我们经常需要处理高维数据。然而,高维数据不仅处理起来麻烦,而且往往也不利于数据分析和模型训练。因此,数据科学家和工程师需要一个有效的方法来降低数据维度。…

【数据结构与算法】- 期末考试

课程链接: 清华大学驭风计划 代码仓库:Victor94-king/MachineLearning: MachineLearning basic introduction (github.com) 驭风计划是由清华大学老师教授的,其分为四门课,包括: 机器学习(张敏教授) , 深度学习(胡晓林教授), 计算…