2.动态库与静态库

1.库的制作

库文件是计算机上的一类文件,可以将库文件看做是一种代码仓库。它提供给使用者一些可以直接拿来用的变量,函数或类。库是一种特殊的程序,但是库是不能单独运行的。

库文件有两种:静态库和动态库

静态库: GCC进行链接时,会把静态库中代码打包到可执行程序中

动态库: GCC进行链接时,动态库的代码不会被打包到可执行程序中,程序启动之后,动态库会被动态加载到内存中,通过动态库地址访问动态库,但是对于自己刚刚写的库系统是不知道库的内存地址的,所以就要自己手动为动态库添加环境变量地址,通过ldd (list dynamic dependencies)命令检查动态库依赖关系

库的好处:1.代码保密(C++ 的反编译还原度非常低) 2.方便部署和分发

应用场景:比如Office软件的各个组成部分有相似的外观和功能,那么就可以调用同一个库文件中的函数生成那些组件

1.1 如何生成静态库

1.1.1 书写相关函数

1.文件如何保存

这里实现了一个算术运算的库,主要进行相关加减乘除操作,并根据命名规则将他们放在对应的目录下

image-20211030111747506

2.文件内容

(1)head.h

对函数进行声明

image-20211030112241751

(2)方法体的实现

add.c

image-20211030112339704

(3) main 执行方法实现

image-20211030112442437

1.1.1 静态库的命名规则

image-20211030105426907 image-20211030105510007

1.1.2 静态库的制作

(1)gcc -c 对库文件编译

gcc -c add.c mult.c sub.c div.c

报错,头文件找不到,使用 -I 将头文件导入

image-20211030112709156
gcc -c add.c mult.c sub.c div.c -I ../include

上面代码注意,不需要添加 head.h ,直接将文件 dictionary 添加进来即可。于是就生成了一堆 .o 文件

image-20211030113140520

(2)对 .o文件进行打包 ,成 .a 库文件

ar rcs libmath.a add.o div.o mult.o sub.o

(3)执行 main.c 方法

执行 main.c 方法,调用的库都是从 head 文件中查找的,所以还会报一个找不到 head.h 文件的情况。这时候将 head.h 再次导入

gcc  main.c -I include/ // 编译
image-20211030114005640

如上图所示,提示未引用库的 error ,这里需要使用 -L 参数将打包的库进行引用

gcc main.c -o app -I ./include/ -L ./lib/ -l math

注意:

-l 参数后的内容是和 -L 后面的文件对应的 .a 文件相关,调用的时候直接添加 lib 的名称即可

1.2 动态库的制作

这里是将上面的文件定义成动态库的方式

1.2.1 文件命名规则

image-20211030121941820

1.2.2 动态库的制作

1.gcc 得到 .o 文件,得到和位置无关的代码

gcc -c -fpic add.c div.c mult.c sub.c -I ../include/

参数:fpic 生成与位置无关的代码,原因是动态库与静态库不同,静态库是将静态库代码嵌套在可执行文件中。但是动态库的代码是放在内存的,是不确定位置的,所以就需要有这个参数

2.gcc 得到动态库

gcc -shared *.o -o libmath.so

*.o 就是将所有的 .o 文件聚合,注意这里别忘了加 .o 参数

shared 作用是生成一个共享库

image-20211030122540111

如上图所示就生成了一个 .so 的可执行文件

3.根据动态库生成可执行文件

gcc main.c -o main -I include/ -L lib/ -l math

但是如果执行这个可执行文件就发现报错,主要是找不到共享库的地址

image-20211030123155301

1.2.3 如何让程序找到共享库

image-20211030123245912
ldd main // 查看所用动态库
image-20211030123531107

查看电脑环境变量:

那么这样的话只需要将动态库的地址配置到环境变量中既可

env

其中 path 就是配置的环境信息

image-20211031223057671

1.2.4 在环境变量中声明动态库

为环境变量添加动态库(用户级别的配置)

用户级别配置是在 .bashrc 文件下配置的

编辑 .branch 文件,在最后添加动态库地址,最后再将这个文件编译一下

image-20211031224750386
source .bashrc   or  . .bashrc // 编译文件

source 的含义是读取并执行 source 后面文件;. 是 source 这个 operation 的简写。最后在执行 ldd main 就找到了这个库的地址,并且 main 这个文件也可以执行

image-20211031225123798

知识延伸:如何查看某个变量的值

上面使用 $+变量名获取变量值,用同样的方法再结合shell 指令就可以使用 ¥ 将这个值输出,看到这个变量中拼接的值

echo $LD_LIBRARY_PATH
image-20211031230234741

为环境变量添加动态库(系统级别的配置)

系统界别的配置主要是在 /etc/profile 文件中,所以就在这个文件下对这个变量添加动态库目录

sudo vim /etc/pro

使用和上面相同的添加动态库的指令,并在最后一行添加动态库地址,并且使用 source 进行编译

image-20211031230654338

最后在执行 main 方法就发现可以运行了

1.2.5 在文件列表中添加 PATH

通过 2.2.3 动态库的保存路径中获知可以直接修改 /etc/ld.so.cache 文件对动态库 path 进行调用。但是这个文件如果使用 vim 打开都是乱码,其实这个文件可以通过使用 conf 文件进行映射

sudo vim /etc/ld.so.conf

直接将地址粘贴到这个文件中即可

image-20211031232137699

然后使用 ldconfig 指令将动态库进行共享

sudo ldconfig

最后就可以直接对 main 文件执行

视频作者不太建议使用直接更改 lib 的方式更改库文件,因为 lib 中的文件太多,容易混乱

1.3 动态库和静态库的区别

1.3.1 制作流程上的差别

1.静态库的制作

image-20211101103923631

2.动态库的制作

image-20211101104000087

1.3.2 静态库的优缺点

1.静态库

优点缺点
静态库被打包到应用程序中加载速度快消耗系统资源,浪费内存
发布程序无序提供静态库,直接调用静态库当静态库中代码更新后,所以引用它的文件全部要进行相关喜欢,更新,部署,发布麻烦

2.动态库

优点缺点
可以实现进程间资源共享加载速度比静态库慢
相比于静态库,动态库更新部署发布简单发布程序是时需要提供依赖的库文件
可以控制何时加载动态库

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

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

相关文章

Jackson 各种注解使用示例

参考资料 Jackson使い方メモ 目录 一. JsonIgnore二. JsonIgnoreProperties三. JsonProperty3.1 作用于entity属性上,指定json对象属性名3.2 作用于entity方法上,指定json对象属性名 四. JsonFormat4.1 日期格式化4.2 数字格式化4.3 枚举类返回code 五.…

Open CASCADE学习|平面上的PCurve

曲面上的曲线PCurve,字面上理解即为参数曲线(Parametric Curve)。在几何建模中,PCurve通常被描述为附加在参数曲面之间公共边上的数据结构。从更具体的定义来看,当给定一个曲面方程,并且其参数u和v是另一个参数t的函数时&#xff…

Redis数据库的简介、部署及常用命令

关系数据库与非关系型数据 关系型数据库 关系型数据库是一个结构化的数据库,创建在关系模型(二维表格模型)基础上,一般面向于记录。sQL语句(标准数据查询语言)就是一种基于关系型数据库的语言&#xff0c…

HarmonyOS NEXT应用开发之Environment:设备环境查询

开发者如果需要应用程序运行的设备的环境参数,以此来作出不同的场景判断,比如多语言,暗黑模式等,需要用到Environment设备环境查询。 Environment是ArkUI框架在应用程序启动时创建的单例对象。它为AppStorage提供了一系列描述应用…

wireshark抓包新手使用教程

Wireshark是非常流行的网络封包分析软件,可以截取各种网络数据包,并显示数据包详细信息。常用于开发测试过程各种问题定位。本文主要内容包括: 1、Wireshark软件下载和安装以及Wireshark主界面介绍。 2、WireShark简单抓包示例。通过该例子学…

20万就想买智能驾驶汽车?!我给你找到了三款车

文 | AUTO芯球 作者 | 雷歌 我都不敢相信,智能驾驶的车型已经这么便宜啦! 一年多前,我一个前同事大冤种,还另掏3万多买某个造车新势力品牌的智驾包呢。 现在动不动就全给你标配了。 近的就说刚刚发布的小米SU7标准版&#xf…

962: 括号匹配问题

【学习版】 【C语言】 【C】 #include<iostream>class MyStack { public:struct Node {char val;Node* prev;Node* next;Node(char x) :val(x), prev(NULL),next(NULL) {};};MyStack() {base new Node(0);top base;}bool empty() {return top base;}void push(int …

Mysql底层原理五:如何设计、用好索引

1.索引的代价 空间上的代价 时间上的代价 每次对表中的数据进⾏增、删、改操作时&#xff0c;都需要去修改各个B树索引。⽽且我们讲过&#xff0c;B树每层节点都是按照索引列的值从⼩到⼤的顺序排序⽽组成了双 向链表。不论是叶⼦节点中的记录&#xff0c;还是内节点中的记录&a…

vue 中使 date/time/datetime 类型的 input 支持 placeholder 方法

一般在开发时&#xff0c;设置了 date/time/datetime 等类型的 input 属性 placeholder 提示文本时&#xff0c; 发现实际展示中却并不生效&#xff0c;如图&#xff1a; 处理后效果如图&#xff1a; 处理逻辑 判断表单项未设置值时&#xff0c;则设置其伪类样式&#xff0c;文…

深度学习基础之一:机器学习

文章目录 深度学习基本概念(Basic concepts of deep learning)机器学习典型任务机器学习分类 模型训练的基本概念基本名词机器学习任务流程模型训练详细流程正、反向传播学习率Batch size激活函数激活函数 sigmoid 损失函数MSE & M交叉熵损失 优化器优化器 — 梯度下降优化…

IVS模型解释

核心思路 【Implied volatility surface predictability: The case of commodity markets】 半参数化模型&#xff1a;利用各种参数(或者因子)对隐含波动率进行降维&#xff08;静态参数化因子模型&#xff09;&#xff0c;对参数化因子的时间序列进行间接的建模 基于非对称…

未来的技术发展趋势

文章目录 前言一、人工智能技术势必聚焦安全能力二、单云环境逐渐让位于多云环境三、后量子密码或将在美大范围普及总结前言 2023 年,与网络空间安全息息相关的人工智能等技术发展迅猛,新的信息安全时代已然拉开大幕。在目睹了 ChatGPT、“星链”和量子通信等技术展现出的巨…

RocketMQ笔记(七)SpringBoot整合RocketMQ发送事务消息

目录 一、简介1.1、流程图1.2、事务消息流程介绍 二、Maven依赖三、生产者3.1、application配置3.2、员工表3.3、实体3.4、持久层3.5、监听器 四、测试4.1、普通消息4.2、事务消息4.2.1、消费者4.2.2、正常提交4.2.3、异常提交 五、其他5.1、接口说明5.2、checkLocalTransactio…

解决Xshell连接Linux虚拟机速度慢问题

我们频繁更换网络环境时&#xff0c;可能会发现xshell连接Linux虚拟机的速度变得很慢 为什么呢&#xff1f; 因为ssh的服务端在连接时会自动检测dns环境是否一致导致的 我们把它修改为不检测即可 修改文件位置&#xff1a; vi /etc/ssh/sshd_config 把 #UseDNS yes 修改…

有关介绍CVPR‘2024工作《持续学习的无干扰低秩适应》正式实施

一个不知名大学生&#xff0c;江湖人称菜狗 original author: Jacky Li Email : 3435673055qq.com Time of completion&#xff1a;2024.04.03 Last edited: 2024.04.03 代码&#xff1a;GitHub - liangyanshuo/InfLoRA&#xff1a;CVPR2024 工作 Interference-Free Low-Rank A…

LeetCode-热题100:240. 搜索二维矩阵 II

题目描述 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。 示例 1&#xff1a; 输入&#xff1a; matrix [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[…

2014最新AI智能系统ChatGPT网站源码+Midjourney绘画网站源码+搭建部署教程文档

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

图书馆自助借书机怎么借书

图书馆自助借书机借书流程如下&#xff1a; 1. 找到图书馆自助借书机&#xff0c;在机器上选择借书功能。 2. 输入自己的借书卡号或者身份证号码&#xff0c;如果是第一次借书&#xff0c;可能需要进行注册。 3. 输入图书的条形码号码&#xff0c;可以通过扫描条形码或者手动输…

Hybrid混合开发 和 Android平台JSBridge的原理

书接上篇&#xff1a;移动端研发技术的进化历程 纯原生开发主要面临动态化和开发成本两个问题&#xff0c;而针对这两个问题&#xff0c;诞生了一些跨平台的动态化框架。 针对原生开发面临的问题&#xff0c;业界一直都在努力寻找好的解决方案&#xff0c;而时至今日&#xf…

【Shell语言学堂】Shell 脚本练习1

Shell 脚本练习 shell语言实战 Shell 脚本练习&#x1f4a7;CSDN划过手的泪滴t现有一个脚本可传入n个参数&#xff0c;要求在脚本中实现在终端输出第n个参数之前的所有参数(不包含第n个参数)编写一个计算bmi体质指数的脚本&#xff0c;该脚本需要用户输入身高和体重信息&#x…