【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.hqwc.cn/news/689460.html

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

相关文章

基于CCS5.5的双音多频(DTMF)信号检测仿真实验(①检测型音频文件②输入生成音频并检测)

DTMF的优点 我们知道,DTMF根本上仍然是频谱分析,基础还是DFT,但DFT通常需要对一整段数据做变换,而DTMF不同,每输入一个采样点就计算一次,更有利于硬件实现。 基于CCS的双音多频(DTMF)信号检测原理 公式详细推导 详细的公式推导在下面这篇博客中已经进行了详细的描述,…

示例十、红外遥控器

通过以下几个示例来具体展开学习,了解红外遥控器原理及特性,学习红外遥控器的应用(干货版): 示例十、红外遥控器 ino文件源码: //Arduino C demo #include "IRremote.h"IRrecv irrecv(4); decode_results …

python自动化办公的代码

以下是一个简单的Python自动化办公代码示例,用于实现一些基本的自动化任务,例如打开文件、读取数据、写入数据和保存文件等。 python import os # 打开文件 def open_file(filename): try: file open(filename, r) data file.read() file.close() ret…

词令蚂蚁庄园今日答案如何在微信小程序查看蚂蚁庄园今天问题的正确答案?

词令蚂蚁庄园今日答案如何在微信小程序查看蚂蚁庄园今天问题的正确答案? 1、打开微信,点击搜索框; 2、打开搜索页面,选择小程序搜索; 3、在搜索框,输入词令搜索点击进入词令微信小程序; 4、打开…

验证码生成--kaptcha

验证码生成与点击重新获取验证码 如图所示&#xff0c;本文档仅展示了验证码的生成和刷新显示。 1. 概述 系统通过生成随机验证码图像和文本。 2. 代码分析 2.1. Maven依赖 <dependency><groupId>com.github.penggle</groupId><artifactId>kaptch…

OpenCV-android-sdk配置及使用(NDK)

opencv官网下载Android版Releases - OpenCV 下载好OpenCV-android-sdk并解压好,然后新建一个jni文件夹测试,测试项目目录结构如下: ├── jni │ ├── Android.mk │ ├── Application.mk │ └── test.cpp Application.mk: APP_STL := c++_static APP_CPP…

perf 中的 cpu-cycles event 介绍

perf 中的 cpu-cycles event 介绍 cycles简介 cycles事件记录处理器核心执行的时钟周期数。每个时钟周期代表处理器内部时钟振荡器的一个周期。这个事件通常用于衡量处理器的执行速度&#xff0c;因为它直接反映了指令执行所需的时间。一个较高的cycles计数可能意味着代码执行…

到东莞樟木头“中国作家第一村”来!这里大有文“樟”

樟木头&#xff0c;古称泰安&#xff0c;一直是康泰平安、物阜民丰之地。作为东莞唯一纯客家镇&#xff0c;传自中原先民的烂漫因子让这座城市崇文重礼&#xff0c;绿水青山更氤氲出古镇芳华。这个文章锦绣地&#xff0c;以其敢为人先、勇立潮头的姿态&#xff0c;成为了各种文…

JS代码随想录(一):数组

代码随想录 一、数组理论基础 二、LeetCode 704. 二分查找 三、LeetCode 27. 移除元素 四、LeetCode 977.有序数组的平方 五、LeetCode 209.长度最小的子数组 六、LeetCode 59.螺旋矩阵II 七、数组总结 一、数组理论基础 数组是存放在连续内存空间上的相同类型数据的集合。 数组…

操作系统基础之磁盘

概述 基本概念 磁盘有正反两个盘面&#xff0c;每个盘面有多个同心圆&#xff0c;每个同心圆是一个磁道&#xff0c;每个同心圆又被划分为多个扇区&#xff0c;数据就被存在扇区中。 磁头首先寻找到对应磁道&#xff0c;然后等到磁盘进行周期旋转到指定的扇区&#xff0c;才…

redis深入理解之数据存储

1、redis为什么快 1&#xff09;Redis是单线程执行&#xff0c;在执行时顺序执行 redis单线程主要是指Redis的网络IO和键值对读写是由一个线程来完成的&#xff0c;Redis在处理客户端的请求时包括获取(socket 读)、解析、执行、内容返回 (socket 写)等都由一个顺序串行的主线…

代码审计-php篇之某CRM系统多处sql注入

&#x1f31f; ❤️ 作者&#xff1a;yueji0j1anke 首发于公号&#xff1a;剑客古月的安全屋 字数&#xff1a;3516 阅读时间: 35min 声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果…