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

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

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


动态库

  • 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 definitions4 if [ -f /etc/bashrc ]; then5   . /etc/bashrc6 fi7 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 functions12 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.mzph.cn/bicheng/10306.shtml

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

相关文章

架构每日一学 4:成为首席架构师,你必须学会顺应人性

本文首发于公众平台:腐烂的橘子 架构师生存法则之二:架构活动需要顺应人性 程序员入行的第一天起就进入了一个机器的世界。在别人的眼中,程序员平时很少说话,更多的时间在和电脑打交道。 程序员工作时间久了大脑会被格式化&…

Java医院绩效考核系统源码B/S+avue+MySQL助力医院实现精细化管理 医院综合绩效核算系统源码

Java医院绩效考核系统源码B/SavueMySQL助力医院实现精细化管理 医院综合绩效核算系统源码 医院绩效考核系统目标是实现对科室、病区财务指标、客户指标、流程指标、成长指标的全面考核、分析,并与奖金分配、学科建设水平评价挂钩。 具体功能模块包括收入核算、成本…

Python中tkinter编程入门3

在使用tkinter创建了窗口之后,可以将一些控件“放置”到窗口中。这些控件包括标签、按键以及输入框等。 1 在窗口中“放置”标签 在窗口中“放置”标签主要有两个步骤,一是创建标签控件,二是将创建好的标签“放置”到窗口上。 1.1 创建标签…

P8803 [蓝桥杯 2022 国 B] 费用报销

P8803 [蓝桥杯 2022 国 B] 费用报销 分析 最值问题——DP 题意分析:从N张票据中选,且总价值不超过M的票据的最大价值(背包问题) K天限制 一、处理K天限制: 1.对于输入的是月 日的格式,很常用的方式是…

AI算法工程师课程学习-数学基础-高数1-微积分

机器学习数学基础学习路线:1.高中数学-->大学2.微积分-->3.线性代数-->4.概率论-->5.优化理论。 为尽快进入到AI算法课程的学习,现在高数的学习要求: 1.看得懂,知道是什么,能听得懂,能理解讲…

RabbitMQ(安装配置以及与SpringBoot整合)

文章目录 1.基本介绍2.Linux下安装配置RabbitMQ1.安装erlang环境1.将文件上传到/opt目录下2.进入/opt目录下,然后安装 2.安装RabbitMQ1.进入/opt目录,安装所需依赖2.安装MQ 3.基本配置1.启动MQ2.查看MQ状态3.安装web管理插件4.安装web管理插件超时的解决…

构建C语言静态库文件并调用的实战案例和详细步骤实现

准备源文件 calc.h 定义加法:int add(int a, int b);定义减法:int sub(int a, int b); #ifndef __CALC_H_ #define __CALC_H_int add(int a, int b); int sub(int a, int b);#endif // __CALC_H_calc.c 简单的实现加法简单的实现减法 #include &quo…

【VTKExamples::Rendering】第五期 环形阵列Rotations

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享VTK样例环形阵列Rotations,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~YO 1. Rotations

C语言例题35、反向输出字符串(指针方式),例如:输入abcde,输出edcba

#include <stdio.h>void reverse(char *p) {int len 0;while (*p ! \0) { //取得字符串长度p;len;}while (len > 0) { //反向打印到终端printf("%c", *--p);len--;} }int main() {char s[255];printf("请输入一个字符串&#xff1a;");gets(s)…

基恩士PLC-KV5500基础入门

一、准备工作&#xff1a; 1.准备的东西&#xff1a;一个基恩士PLC-KV5500模块。两个自复位开关&#xff0c;24v LED灯一个&#xff0c;24v开关电源一个&#xff0c;KV5500端子台IO线缆&#xff1b;有编程软件的电脑一台。 编程软件&#xff1a; 基恩士PLC-KV5500接线图&…

【MySQ】9.构建高可用数据库:MySQL集群模式部署大全

单个MySQL节点的主要风险在于它构成了一个单点故障&#xff0c;这意味着任何硬件故障、软件崩溃或维护需求都可能导致整个数据库服务中断&#xff0c;从而影响到业务的连续性和数据的安全性。此外&#xff0c;它还限制了系统的扩展性&#xff0c;使得性能提升和负载均衡变得困难…

C++的数据结构(一)

在计算机科学领域&#xff0c;数据结构扮演着至关重要的角色。它们为有效地存储、检索和操作数据提供了基础框架。C作为一种高效且功能强大的编程语言&#xff0c;为数据结构的实现和应用提供了丰富的工具。本文将探讨C数据结构的重要性&#xff0c;并通过示例展示其在数据结构…

LeetCode-258. 各位相加【数学 数论 模拟】

LeetCode-258. 各位相加【数学 数论 模拟】 题目描述&#xff1a;解题思路一&#xff1a;循环解题思路二&#xff1a;进阶 O(1)解题思路三&#xff1a; 题目描述&#xff1a; 给定一个非负整数 num&#xff0c;反复将各个位上的数字相加&#xff0c;直到结果为一位数。返回这个…

力扣/leetcode383.比特位记数

题目描述 给你一个整数 n &#xff0c;对于 0 < i < n 中的每个 i &#xff0c;计算其二进制表示中 1 的个数 &#xff0c;返回一个长度为 n 1 的数组 ans 作为答案。 示例 代码思路 第一种方法 最简单的方法就是&#xff0c;遍历然后使用python自带的bin()方法直接…

视频合并有妙招:视频剪辑一键操作,批量嵌套合并的必学技巧

在数字时代的今天&#xff0c;视频已经成为我们日常生活和工作中不可或缺的一部分。无论是记录生活点滴&#xff0c;还是制作专业项目&#xff0c;视频合并都是一个常见的需求。然而&#xff0c;对于许多人来说&#xff0c;视频合并却是一个复杂且繁琐的过程。现在有云炫AI智剪…

域基础-NTLM协议

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

Tarjan----寻找最近公共祖先(LCA) 板子

一、Tarjan算法作用&#xff1a; Tarjan算法是一种用于寻找图中节点的最近公共祖先&#xff08;LCA&#xff09;的算法。该算法通过深度优先搜索&#xff08;DFS&#xff09;遍历图&#xff0c;并使用并查集&#xff08;Union-Find&#xff09;数据结构来快速找到两个节点的最近…

前端笔记-day04

文章目录 01-后代选择器02-子代选择器03-并集选择器04-交集选择器05-伪类选择器06-拓展-超链接伪类07-CSS特性-继承性08-CSS特性-层叠性09-CSS特性-优先级11-Emmet写法12-背景图13-背景图平铺方式14-背景图位置15-背景图缩放16-背景图固定17-background属性18-显示模式19-显示模…

【小红书采集软件】根据关键词批量爬取小红书笔记正文、笔记链接、发布时间、转评赞藏等

一、背景介绍 1.1 爬取目标 熟悉我的小伙伴可能了解&#xff0c;我之前开发过2款软件&#xff1a; 【GUI软件】小红书搜索结果批量采集&#xff0c;支持多个关键词同时抓取&#xff01; 【GUI软件】小红书详情数据批量采集&#xff0c;含笔记内容、转评赞藏等&#xff0c;支…

工业中常见大数据技术组件

随着大数据技术在各行各业的广泛应用&#xff0c;数据产品经理的角色也变得越来越重要。了解常见的大数据技术组件对于数据产品经理来说至关重要&#xff0c;因为这有助于他们更好地设计产品架构和功能模块&#xff0c;满足数据处理和分析的需求。在处理海量数据的产品中&#…