【Linux】从零开始认识动静态库 -动态库

news2024/11/17 22:22:21

在这里插入图片描述
送给大家一句话:
我不要你风生虎啸,
我愿你老来无事饱加餐。
– 梁实秋 《我把活着欢喜过了》

ଘ(੭ˊᵕˋ)੭* ੈ✩‧₊˚ଘ(੭ˊᵕˋ)੭* ੈ✩‧₊˚ଘ(੭ˊᵕˋ)੭* ੈ✩‧₊˚
ଘ(੭ˊᵕˋ)੭* ੈ✩‧₊˚ଘ(੭ˊᵕˋ)੭* ੈ✩‧₊˚ଘ(੭ˊᵕˋ)੭* ੈ✩‧₊˚
ଘ(੭ˊᵕˋ)੭* ੈ✩‧₊˚ଘ(੭ˊᵕˋ)੭* ੈ✩‧₊˚ଘ(੭ˊᵕˋ)੭* ੈ✩‧₊˚


动态库

  • 1 建立动态库
  • 2 使用动态库
    • 2.1 小试牛刀
    • 2.2 配置动态库
      • 方法一(暴力解决)
      • 方法二(环境变量)
      • 方法三(初始化)
      • 方法四(配置文件)
  • 3 总结
  • Thanks♪(・ω・)ノ谢谢阅读!!!
  • 下一篇文章见!!!

1 建立动态库

下面我们再提一个选项:

  • -fPIC : 产生位置无关码(动态库里非常重要)

使用一下: 在这里插入图片描述
因为动态库使用的非常频繁,所以gcc就给我们提供了形成动态库的方法。
在这里插入图片描述
这里出现了main函数的报错。因为代码中没有main函数,就不可能形成可执行程序!

所以我们需要加上-shared选项!!!
在这里插入图片描述
于是我们就形成了动态库!!!
把动态库一起打包到mylib里,可以让用户自行选择使用

2 使用动态库

2.1 小试牛刀

刚才我们已经在mylib下建立动态库,接下来就来看看如何使用吧:
这是gcc的选项:

  • -I(大写 i) :可以帮助程序员动态的加入头文件的搜索路径
  • -L :可以帮助程序员动态加入需要链接的库文件的搜索路径
  • -l(小写 L ):指明需要链接的库

在这里插入图片描述

直接gcc编译肯定是不可以的,报错说找不到库,那么我们就加上-I选项:
在这里插入图片描述
现在提醒我们是找不到函数的实现,找不到那我们就给他加上呗,使用-L选项加入库的搜索路径,然后指明使用的库文件:
在这里插入图片描述
现在好了,我们运行试试奥:
在这里插入图片描述

啊??? 什么情况???明明声明了啊,怎么还链接不上啊!
那应该怎么做呢?我们需要进行一些配置,就可以平滑的使用动态库了!

2.2 配置动态库

分析一下问题:
gcc test.c -I mylib/include/ -L mylib/lib/ -lmyc命令只是将需要使用的动态库刚告诉给了gcc编译器,并没有告诉操作系统!!!

  • 动态库在程序运行的时候,要找到对应的动态库加载并运行(所以要告诉操作系统)
  • 静态库就不需要,因为编译的时候就把库中的代码拷贝到了可执行程序内部了!加载就和库没有关系了!

那怎么才能让操作系统明白呢?

方法一(暴力解决)

我们来看一个目录/lib64/
在这里插入图片描述
这里面有许多的动态库,所以为了让操作系统可以找到我们的库,我们可以直接将我们的库放到这个目录下:
拷贝到这里就可以了:
在这里插入图片描述

这样就成链接到了,我们不进行重新编译就要可以正常运行,说明动态库与可执行文件处于一种松耦合的状态!

我们也可以在/lib64/下建立一个软链接:
在这里插入图片描述
这样也是同样的效果,我们可以正常运行我们的可执行程序!!!

这个方法虽然简单,但是操作系统的文件可不兴改奥!!!所以我们接下来再来看看其他方法:

方法二(环境变量)

我们之前学习过环境变量,关于动态库的搜索路径也有一个变量:
在这里插入图片描述
这个变量里就存放着动态库的加载路径,我们只需要把我们的库路径加入进去就可以了

在这里插入图片描述

这样我们的可执行程序也就可以正常链接了:
在这里插入图片描述
但是这还是会有一个弊端,环境变量会在每次重启对话的时候初始化,会刷新掉我们的数据,所以为了保证不需要每次都修改环境变量,所以我们就来看看

方法三(初始化)

我们学习环境变量的时候,提到过我们的用户家目录会有几个脚本文件:
在这里插入图片描述
我们打开.bashrc

 1 # .bashrc                                                                                                                                                                     
  2 
  3 # Source global definitions
  4 if [ -f /etc/bashrc ]; then
  5   . /etc/bashrc
  6 fi
  7 
  8 # Uncomment the following line if you don't like systemctl's auto-paging feature:
  9 # export SYSTEMD_PAGER=
 10 
 11 # User specific aliases and functions
 12 alias vim='/home/jlx/.VimForCpp/nvim'
 13 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:~/.VimForCpp/vim/bundle/YCM.so/el7.x86_64

我们加入对应的路径就可以了:

13 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:~/.VimForCpp/vim/bundle/YCM.so/el7.x86_64:/home/jlx/lesson22/roommate/mylib/lib

这样每次启动会话的时候,就可以链接到我们的动态库了!!!
这个方法终归是像“为了一碟醋,包了顿饺子”,因为如果这个动态库很重要,那就直接放到/lib64/下不就好了;如果不重要,那就不要把环境变量改来改去(没准会引发问题)

方法四(配置文件)

除了上述的方法我们还有其他办法哦:
比如在这个路径下:
在这里插入图片描述
有这些配置文件,而我们要做到就是吧把我们的动态库的路径加入到配置文件中。

因为这些文件都是root的,所以操作时要注意权限!
首先我们要在/etc/ld.so.conf.d创建一个.conf配置文件
在这里插入图片描述
在文件中写入我们的路径:
/home/jlx/lesson22/roommate/mylib/lib
然后使用命令ldconfig让配置文件生效就可以了
这样就可以了!!!

3 总结

建立动态库的前提是.o文件带有位置无关码:

  • -fPIC : 产生位置无关码(动态库里非常重要)
  • 命令:gcc -fPIC -c 文件名

打包过程直接使用gcc:gcc -shared -o 文件名 -o lib库名.so在把头文件设置好,这样就建立了动态库!

我们列举一下使用动态库的方法

  1. 直接安装到系统中/lib64/(或者建立软连接)
  2. 命令行修改环境变量
  3. 修改环境变量初始化脚本文件.bashrc
  4. 增添配置文件

Thanks♪(・ω・)ノ谢谢阅读!!!

下一篇文章见!!!

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

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

相关文章

数据结构与算法学习笔记三---队列的链式存储表示和实现(C++)

目录 前言 1.队列的概念 2.队列的表示和实现 1.定义 2.初始化 ​编辑 3.销毁队列 4.清空队列 5.队列判空 6.队列长度 7.获取队头元素 8.入队 9.出队 10.遍历 11.完整代码 前言 这篇博客主要讲的是对队列的链式存储。 1.队列的概念 队列是一种访问受限的线性表。…

如何将一个VPS上的网站全部迁移至另外一个VPS服务器

最近我们老的VPS即将到期,由于近期Hostease的VPS活动力度较大,我们购买了Hostease的VPS,购买后需要将原服务器的所有网站迁移到Hostease提供的VPS中。在Hostease技术人员的帮助下,我们成功进行了迁移,下面我就介绍此次…

酷开科技丨母亲节,别让有爱瞬间轻易溜走

在母亲节这个充满温情的节日里,酷开科技以“健健康康才能长长久久”为主题,推出了一系列关怀活动,旨在通过科技的力量,提升母亲们的身体素质和生活质量,同时也为儿女们提供了表达孝心和关怀的机会。 酷开系统特别上线…

域基础-NTLM协议

简介 NTLM(New Technology LAN Manager)协议是微软用于Windows身份验证的主要协议之一。继SMB、LM协议之后微软提出了NTLM协议,这一协议安全性更高,不仅可以用于工作组中的机器身份验证,又可以用于域环境身份验证,还可以为SMB、H…

深入解析RedisSearch:全文搜索的新维度

码到三十五 : 个人主页 在当今的数据时代,信息的检索与快速定位变得尤为关键。Redis,作为一个高性能的内存数据库,已经在缓存和消息系统中占据了重要地位。然而,Redis并不直接支持复杂的搜索功能。为了填补这一空白&am…

Android AOSP Ubuntu源码编译电脑卡顿问题定位解决

文章目录 问题概述分析问题解决问题查看交换分区创建交换分区删除交换分区调整交换分区的活跃度 问题概述 开发SystemUI时,使用内存为16G的主机,Ubuntu 20.04的系统编译SystemUI的源码,编译的过程中发现电脑卡顿,鼠标不能移动。必…

渗透思考题

一,尝试登录。 客户端对密码进行哈希处理并缓存密码hash,丢弃实际的明文密码,然后将用户名发送到服务器,发起认证请求 密文存储位置:数据库文件位于C:WindowsSystem32configsam,同时挂载在注册表中的HKLMSA…

台阶仪测量膜厚原理及优势

台阶仪,也称为探针式轮廓仪或接触式表面轮廓测量仪,主要用于台阶高、膜层厚度、表面粗糙度等微观形貌参数的测量。 台阶仪的工作原理 台阶仪的核心部件是一个精密的触针或探针,它被安装在一个高度可调的支架上。当触针沿被测表面轻轻滑过时…

vue阶段案例,练习filter、map、forEach,双向绑定,三元表达式,以及图片滚动,文字跳动等等。

阶段案例 通过案例来练习双向绑定&#xff0c;三元表达式&#xff0c;以及图片滚动&#xff0c;文字跳动等等。 代码如下&#xff1a; <template><table class"bjtp" ><div class"title" >{{title}}</div><div class"s…

ACM实训冲刺第四天

【碎碎念】最近的任务有点繁重&#xff0c;所以考虑到实际情况&#xff0c;视频学习决定放置一段时间&#xff0c;重点是学校的实训练习题&#xff0c;对于我而言&#xff0c;目标不是优秀/良好&#xff0c;综合考虑我的实际情况&#xff0c;保佑我及格、顺利通过就可&#xff…

机器学习算法应用——神经网络回归任务、神经网络分类任务

神经网络回归任务&#xff08;4-3&#xff09; 神经网络回归任务&#xff0c;通常指的是使用神经网络模型进行回归分析。回归分析是一种统计学方法&#xff0c;用于研究一个或多个自变量&#xff08;预测变量&#xff09;与一个因变量&#xff08;响应变量&#xff09;之间的关…

node pnpm修改默认包的存储路径

pnpm与npm的区别 PNPM和NPM是两个不同的包管理工具。 NPM&#xff08;Node Package Manager&#xff09;是Node.js的官方包管理工具&#xff0c;用于安装、发布和管理Node.js模块。NPM将包安装在项目的node_modules目录中&#xff0c;每个包都有自己的依赖树。 PNPM&#xf…

c++ STL 之栈—— stack 详解

vector 是 stl 的一个关联容器,名叫“栈”&#xff0c;何为“栈”&#xff1f;其实就是一个数组&#xff0c;但有了数组何必还需栈&#xff0c;这是一个高深的问题。 一、简介 1. 定义 栈&#xff0c;是一个柔性数组&#xff08;可变长数组&#xff09;&#xff0c;可以变大变小…

【教程向】从零开始创建浏览器插件(三)解决 Chrome 扩展中弹出页面、背景脚本、内容脚本之间通信的问题

第三步&#xff1a;解决 Chrome 扩展中弹出页面、背景脚本、内容脚本之间通信的问题 Chrome 扩展开发中&#xff0c;弹出页面&#xff08;Popup&#xff09;、背景脚本&#xff08;Background Script&#xff09;、内容脚本&#xff08;Content Script&#xff09;各自拥有独立…

设计模式2——原则篇:依赖倒转原则、单一职责原则、合成|聚合复用原则、开放-封闭原则、迪米特法则、里氏代换原则

设计模式2——设计原则篇 目录 一、依赖倒转原则 二、单一职责原则&#xff08;SRP&#xff09; 三、合成|聚合复用原则&#xff08;CARP&#xff09; 四、开放-封闭原则 五、迪米特法则&#xff08;LoD&#xff09; 六、里氏代换原则 七、接口隔离原则 八、总结 一、依赖…

R语言数据探索与分析-碳排放分析预测

# 安装和加载需要的包 install.packages("readxl") install.packages("forecast") install.packages("ggplot2") library(readxl) library(forecast) library(ggplot2)# 数据加载和预处理 data <- read_excel("全年数据.xlsx") co…

有哪些是618必买的数码好物,这几款千万别错过

备受瞩目的618购物节即将拉开帷幕&#xff0c;身为数码领域的资深发烧友&#xff0c;我迫不及待地要为大家呈现一系列精心挑选的数码产品。无论您是热衷于追求科技尖端的先锋者&#xff0c;还是希望用智能设备为生活增添一抹亮色的品味人士&#xff0c;这里总有一款能让您心动的…

【python】python中的argparse模块,教你如何自定义命令行参数

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

ARM基于DWT实现硬件延时(GD32)

软件延时的缺点 软件延时的精度差&#xff0c;受系统主频影响&#xff0c;调教困难 硬件延时 DWT数据跟踪监视点单元硬件延时 硬件延时实现代码 delay.c #include <stdint.h> #include "gd32f30x.h"/** *****************************************************…

【算法入门赛】A.坐标变换(推荐学习)C++题解与代码

比赛链接&#xff1a;https://www.starrycoding.com/contest/8 题目描述 武汉市可以看做一个二维地图。 牢 e e e掌握了一项特异功能&#xff0c;他可以“瞬移”&#xff0c;每次瞬移需要分别设定 x x x和 y y y的偏移量 d x dx dx和 d y dy dy&#xff0c;瞬移完成后位置会…