Linux的动静态库

news2024/11/24 18:40:33

动静态库

  • 1. 见一见动静态库
  • 2. 动静态库概念
    • 2.1 为什么要有动静态库
    • 2.2 定义
  • 3. 写一写——库的设计角度
    • 打包成静态库
    • 打包成动态库
  • 4. 用一用——使用者角度
    • 4.1 直接使用头文件和源文件(直接给源代码)
    • 4.2 得到头文件和源文件进过处理后形成的二进制文件.o
    • 4.3 得到头文件和静态库
    • 4.4 得到静态库的压缩包
    • 4.5 将头文件和静态库文件安装到系统路径下
    • 4.6 得到动态库
    • 总结第三方库的使用关键
  • 5. 动态库的配置与使用
    • 5.1 配置环境变量LD_LIBRARY_PATH(临时方案)
    • 5.2 在系统库路径下建立动态库的软链接
    • 5.3 配置文件方案
  • 6. 动态库的理解——加载
    • 动态库(共享库)VS静态库
    • 动态库链接原理
    • 库中地址的理解
  • 7. 其他实验

1. 见一见动静态库

我们是否使用了库?答案:肯定的!C语言/C++调用的函数就是C库和C++库。
衡量一个语言的好坏的标准:
①应用场景;②语言生态(语言论坛是否好,学习资料是否多且正确)

1.其实,我们在安装VS的时候,就是要安装对应的头文件和库文件,头文件提供方法说明,库提供方法的实现,这是要结合在一起使用的。
2.头文件是在预加载的时候引入的,而库文件是在在链接的时候使用的,链接的本质就是在链接库!

库都会被安装在系统的特定目录下。/usr/lib文件里。库就是二进制文件
头文件一般在/usr/include/,路径里面

在这里插入图片描述
【理解现象】

  1. 我们在VS2019,下安装开发环境——安装编译器软件,安装要开发的语音配套的库文件和头文件。
  2. 我们在使用编译器,都会有语法的自动提醒功能,需要先包含头文件的。语法提醒本质:编译器或者编辑器,它会自动的将用户输入的内容,不断的在被包含的头文件中进行搜索,自动提醒功能是依赖头文件的。
  3. 我们在写代码的时候,我们的环境怎么知道我们的代码中有哪些地方有语法报错,哪些地方定义变量有问题?不要小看编译器,有命令行的模式,还有其他自动化的模式帮我们不断在进行语法检查。

2. 动静态库概念

2.1 为什么要有动静态库

提高开发效率——例如:因为存在库,我们不用再自己实现printf等基础功能函数,大大减少了开发时间,从而提高了开发效率。
学习语言中,存在已经存在多个库(轮子),我们要少造轮子,多用轮子,学习轮子为了更好的用轮子!

2.2 定义

  • 前缀都是lib,后缀.a表示静态库,.so表示动态库,才是库的名字
  • 静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库
  • 动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。
    在这里插入图片描述

3. 写一写——库的设计角度

【步骤】
①编写头文件和源文件
在这里插入图片描述
②进行打包在同一个文件中
在这里插入图片描述

③将源文件经过预处理,编译,汇编形成二进制文件.o
在这里插入图片描述
④打包.o文件成库

打包成静态库

在这里插入图片描述

在这里插入图片描述
注意:命名规则,前缀lib,后缀.a,中间才是库的名字mymath

打包成动态库

在这里插入图片描述
gcc 编译需要加上fPIC选项,形成的.o:与位置无关码
【动态库gcc进行打包】
在这里插入图片描述

⑤ 将头文件放在include的文件夹里,将库放到lib文件夹里,进行压缩打包。
在这里插入图片描述
⑥将压缩包上传到yum源或者githue等开源上,配套上说明文档,就可以给别人使用了!

4. 用一用——使用者角度

4.1 直接使用头文件和源文件(直接给源代码)

在这里插入图片描述

在这里插入图片描述

4.2 得到头文件和源文件进过处理后形成的二进制文件.o

在这里插入图片描述
得到不到源代码。
——文件太多,不好。打包.o文件->引出打包成库的概念

4.3 得到头文件和静态库

在这里插入图片描述
【无法直接编译main.c文件】
在这里插入图片描述
出现了链接错误的问题!——找不到函数定义的地方

所以,当我们有了一个库,接下来,要将库引入我们的项目,必须让编译器找到头文件和库文件。
在这里插入图片描述

4.4 得到静态库的压缩包

①下载压缩包
在这里插入图片描述
②进行解压
在这里插入图片描述
此时还不能直接编译——找不到头文件
在这里插入图片描述
③找到头文件和库文件
在这里插入图片描述
【选项说明】
-I加路径——说明在哪里找头文件
-L加路径——说明在哪里找库文件
-l加库文件名(注意要去掉前后缀)
在这里插入图片描述

4.5 将头文件和静态库文件安装到系统路径下

在这里插入图片描述

在这里插入图片描述
此时编译报错是找不到库文件,但是可以找到头文件
在这里插入图片描述
在这里插入图片描述
此时要指明链接的库的名字

4.6 得到动态库

在这里插入图片描述

此时运行会报错–》操作系统找不到链接的库,因为gcc编译的时候只是告诉了编译器库文件的路径,没有告诉操作系统。
在这里插入图片描述
静态库是直接拷贝到可执行程序中,而动态库不会!
在这里插入图片描述
此时要对动态库进行配置。

总结第三方库的使用关键

  1. 需要指定的头文件和库文件
  2. 如果没有默认安装到系统gcc,g++默认的搜索路径下,用户必须指明对应的选项,告知编译器:a.头文件在哪里(大写I选项);b.库文件在哪里(L选项);c.库文件具体的名字(l选项)
  3. 将我们下载下来的头文件和库文件,拷贝到默认系统路径下——L在inux下安装库!对于任何软件而言,安装和卸载的本质就是拷贝到系统文件特定的路径下!
  4. 如果我们安装的库是第三方的(语言,操作系统系统接口)库,我们要正常使用,即便是已经全部安装到了系统中,gcc/g++必须用-l 指明具体库的名称!

在这里插入图片描述

5. 动态库的配置与使用

5.1 配置环境变量LD_LIBRARY_PATH(临时方案)

将库的路径添加到环境变量中
在这里插入图片描述
在这里插入图片描述

5.2 在系统库路径下建立动态库的软链接

在这里插入图片描述
在这里插入图片描述

5.3 配置文件方案

在目录 /ect/ld.so.conf.d/下,添加.conf 的文件名,在里面写入动态库所在的路径

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

就可以了!!!

6. 动态库的理解——加载

动态库(共享库)VS静态库

静态链接形成的可执行程序,本身就有静态库中对应方法的实现。
静态链接的优点:形成可执行程序后不受库的影响。
缺点:非常浪费资源(磁盘,可执行程序的体积变大加载占用内存,下载周期变长,占用网络资源)
动态库是共享的,不会浪费资源

动态库链接原理

动态链接本质:将可执行程序中的符号,替换成库中的具体地址。
动态库在程序运行时要执行某个函数的时候,OS会根据搜索路径找到库文件,并加载到内存中,管理程序的进程,会通过页表的映射找到库文件在内存中的位置,在映射到虚拟地址的共享区中,这样就可以执行这个函数了。

在这里插入图片描述
共享库,只要通过映射到自己的地址空间上,就可以调用相应的方法。

加载库的时候,不会全部加载到内存中,OS会根据实际情况,加载相应的方法到内存中。

库中地址的理解

在程序编译链接形成可执行程序的时候,内部存在地址。
在这里插入图片描述
动态库必定面临一个问题:
不同的进程,运行程度不同,需要使用的第三方库不同,注定了,每一个共享空间的空闲位置是不同的。
所以,动态库中的地址,不能采用绝对编址,要采用偏移量,默认从0开始。
在这里插入图片描述
通过偏移量,就可以局部加载动态库到内存了!

7. 其他实验

在这里插入图片描述

动静态库都存在的时候,默认是动态链接
在这里插入图片描述
加-static就是要求静态链接

没有动态库的时候,会链接静态库。(多个库,有动态库就链接动态库,没有就链接静态库,啥都没有就报错)
在这里插入图片描述

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

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

相关文章

C++ - 20230703

一. 思维导图 二.练习 全局变量,int monster 10000;定义英雄类hero,受保护的属性string name,int hp,int attck;公有的无参构造,有参构造,虚成员函数 void Atk(){blood-0;},法师类继承自英雄类…

SpringCloud:微服务技术

一、认识微服务: 首先,微服务架构不等于SpringCloud,微服务架构是一种经过良好架构设计的分布式架构方案, ,它将应用构建成一系列按业务领域划分模块的,小的自治服务,并解决服务拆分所产生的各种…

css基础知识十五:如果要做优化,CSS提高性能的方法有哪些?

一、前言 每一个网页都离不开css,但是很多人又认为,css主要是用来完成页面布局的,像一些细节或者优化,就不需要怎么考虑,实际上这种想法是不正确的 作为页面渲染和内容展现的重要环节,css影响着用户对整个…

DL环境安装之GCC9,Python9与IDE连接远程环境:python notebook,解释器,C toolchain

文章目录 一.安装gcc91. 设置x86 centos7 yum源2. 编译安装 二、安装python3.91.前置依赖2. 编译安装3.建立软连接或环境变量 三、IDE连接远程环境1.IDE 远程notebook2.IDE 远程Python解释器3.远程toolchain (后续可能有用) 一.安装gcc9 系统自带的cc可…

2023亚马逊云科技中国峰会——Amazon DeepRacer

1.DeepRacer技术背景 早在20世纪初汽车问世之时,发明家们便已提出无人驾驶的设想。但即便是实现无人驾驶的初级阶段,也经历了足足百年时间。毕竟在复杂的城市路况下,机器若想像人一样实现感知、决策、控制等功能,必定面临各种复杂…

Simulink仿真模块 - Product

Product:标量和非标量的乘除运算或者矩阵的乘法和逆运算 库:Simulink / Commonly Used Blocks Simulink / Math Operations HDL Coder / Commonly Used Blocks HDL Coder / HDL Floating Point Operations HDL Coder / Math Operations 模型为: 双击模型打开参数设置界面为…

静电测试仪如何在生产中帮助我们

静电测试仪在生产中可以帮助我们进行静电防护和质量控制。以下是它在生产中的具体帮助: 1. 静电防护:静电测试仪可以用来测量物体表面的静电电荷,通过监测静电电荷的大小和分布情况,预防静电产生和积累,降低产品受到静…

如何快速构建一个交互式的JavaScript UI仪表板?用DHTMLX很简单!

DHTMLX Suite包含了超过20个UI小部件,可以帮助开发功能齐全的Web应用程序。例如,开发者可以创建一个全面的仪表板来可视化和监控票务系统的性能。 在本文这个JavaScript仪表板教程中,我们将介绍如何在DHTMLX Suite UI小部件和Optimus微框架的…

Android性能优化-数据结构

本文链接:Android性能优化-数据结构_猎羽的博客-CSDN博客 云笔记链接:https://note.youdao.com/s/84OhDByE

SysML建模示例水蒸馏器图形大全(从图16.1到图16.30)EA从零开始复刻

DDD领域驱动设计批评文集 欢迎加入“软件方法建模师”群 《软件方法》各章合集

图像聚类算法

什么是分类 分类 分类其实是从特定的数据中挖掘模式,作出判断的过程。 分类学习主要过程: (1)训练数据集存在一个类标记号,判断它是正向数据集(起积极作用,不是垃圾短信)&#xf…

C++与JAVA中迭代器的不同

1.C迭代器 #include <iostream> #include <vector> using namespace std;int main() {vector<int> vec;for(int i 0; i < 10; i) vec.push_back(i);for(std::vector<int>::iterator it vec.begin(); it ! vec.end(); it) {cout << "…

以太网常见设备(五)

目录 一、网卡 二、中继器 三、集线器 四、网桥 五、2层交换机 六、路由器 七、网关 一、网卡 网卡&#xff0c;全称网络接口卡&#xff0c;有时也叫做网络适配器、网卡、LAN卡。是计算机连接网络的接口。 二、中继器 中继器是OSI模型第1层物理层面上延长网络的设备。其…

pdf怎样转换成ppt格式?分享简单快捷的方法!

PDF和PPT是两种常见的文件格式&#xff0c;它们在使用场景上有所不同。PDF适合单独阅读和查看&#xff0c;而PPT则更适合在多人演讲时进行演示。有时候我们需要将PDF文件转换为PPT格式&#xff0c;以便进行演示、分享或修改。这在教育培训行业尤其常见&#xff0c;教师经常需要…

01-基础入门-概念名词

基础入门-概念名词 基础入门-概念名词1、域名&#xff08;1&#xff09;什么是域名&#xff08;2&#xff09;在哪里注册域名&#xff08;3&#xff09;二级域名和多级域名&#xff08;4&#xff09;域名对安全测试的意义 2、DNS&#xff08;1&#xff09;什么是DNS&#xff08…

常用开发功能——批量文件导出

某天工作接到一个需求&#xff1a;批量导出场站的订单信息&#xff0c;一个场站一个Excel文档&#xff1b; 与单个文件导出的区别在于&#xff0c;单个导出一次性只导出一个文件&#xff0c;在输出流中写入这一个文件即可&#xff0c;那么如何一次性导出多个文件&#xff1f;难…

茶叶小程序怎么做

茶叶小程序商城是一个专为茶叶爱好者打造的购物平台&#xff0c;提供了一系列便利的功能&#xff0c;使用户能够轻松选购适合自己口味的优质茶叶。以下是该小程序商城的主要功能介绍&#xff1a; 1. 商品展示&#xff1a;在茶叶小程序商城中&#xff0c;用户可以浏览各种各样的…

点云滤波Filtering

直通滤波 就是设置一个x、y、z方向的一个取值范围&#xff0c;以过滤掉明显不在测试距离范围的点云&#xff1b;使用Intel RealSense或者激光雷达采集的数据&#xff0c;可设置一个x,y,z合理的范围&#xff0c;过滤掉我们不需要的点云。 pcl::PassThrough 是点云库&#xff08;…

4通道AD采集子卡模块有哪些推荐?

FMC134是一款4通道3.2GSPS&#xff08;2通道6.4GSPS&#xff09;采样率12位AD采集FMC子卡模块&#xff0c;该板卡为FMC标准&#xff0c;符合VITA57.4规范&#xff0c;可以作为一个理想的IO模块耦合至FPGA前端&#xff0c;16通道的JESD204B接口通过FMC连接器连接至FPGA的高速串行…

IDEA在已有项目中新建module

1.在已经新建的项目名上右击&#xff0c;选择New->Module。 2.Location选择项目地址&#xff0c;Type选择Maven&#xff0c;Language选择Java&#xff0c;Group输入com.组名&#xff08;包名&#xff09;&#xff0c;Artifact输入项目名&#xff0c;Java选择8&#xff0c;Pa…