Linux:动态库和静态库的编译与使用
目录
1.前言
2.静态链接库
3.静态链接库生成步骤
4.静态链接库的使用
5.动态链接库
6.动态链接库生成步骤
7.动态链接库的使用
8.动态链接库无法加载
9.解决动态链接库无法加载问题
前言
在《MinGW:从入门到链接库》博客中简单介绍了如何编译动态链接库和静态链接库,本篇博客将详细的对Linux下编译动态链接库和静态链接库以及使用进行讲解,刨析创建库文件的时候Linux做了哪些操作。本篇博客将从静态链接库讲起,再到动态链接库的讲解,并配上演示图片
静态链接库
静态链接库是一组编译后的代码和资源,它们在编译时被整合到最终的可执行文件中。其静态链接库在不同系统的命名规则如下:
1..Linux下的动态链接库的命名规则为lib+文件名+.a,所以Linux中以.a结尾的文件,一般可以视为静态链接库的文件
示例:libWild.a
2.Windows下的动态链接库的命名规则为lib+文件名+.lib,所以以.lib结尾的文件,一般可以视为静态链接库的文件
示例:libWild.lib
静态链接库的优缺点如下
优点:
1.库代码已经包含在可执行文件中,不需要携带额外的库文件
2.执行速度快,因为操作系统不需要在运行时解析外部库
缺点:
1.增加了可执行文件的大小,因为其静态链接库包含了所有代码
2.如果库更新,需要重新编译整个应用程序,编译时间长
静态链接库生成步骤
在了解了静态链接库的特点以及不同系统下的命名方式后,我们需要着手生成一个静态链接库文件:
1.使用-c命令生成汇编文件
//使用-c命令生成汇编文件
g++ -c -I "头文件路径" *.cpp
2.使用ar命令打包生成静态链接库
//使用ar命令生成静态链接库
ar rcs 静态链接库名.a 汇编文件.o//ar rcs libfun.a fun.o
//其中r代表替换.o文件,c代表库不存在则生成,s代表生成索引文件
可参考下图生成静态链接库:

图1.生成静态链接库
静态链接库的使用
当使用命令生成一个可用的静态链接库后,我们需要将其源文件与静态链接库放到同一个目录中,然后根据头文件编写代码, 对静态库中的函数进行调用
1.将源文件与静态链接库链接产生可执行文件
//方法1
g++ 源文件.o -o 可执行文件名 静态链接库路径//方法2
g++ 源文件.o -o 可执行文件名 -L静态链接库路径//方法3,其中静态链接库名为除去lib和.a的名称
//例如libfun.a,其静态链接库名就为fun
g++ 源文件.o -o 可执行文件名 -L静态链接库路径 -l静态链接库名

图2.多种方法生成静态链接库可执行文件
PS:如果提示找不到头文件的定义,需要使用-L和-l命令,其含义如下:
-L: 指定库所在的路径
-l: 指定库的名字, 需要去掉前缀lib和后缀.a示例:g++ Code.o -o Code -L ./ -l fun
//其中fun为静态链接库libfun.a
动态链接库
动态链接库在程序运行时被加载,而不是在编译时。它允许多个程序共享同一份库代码。其命名规则如下:
1..Linux下的动态链接库的命名规则为lib+文件名+.so,所以Linux中以.so结尾的文件,一般可以视为动态链接库的文件
示例:libWild.so
2.Windows下的动态链接库的命名规则为lib+文件名+.dll,所以以.dll结尾的文件,一般可以视为动态链接库的文件
示例:libWild.dll
动态链接库的优缺点如下:
优点:
1.减少了内存占用,因为多个程序可以共享同一份库代码
2.库的更新只需要更新DLL文件本身,不需要重新编译使用该库的应用程序
3.可以动态加载和卸载,提供更高的灵活性
缺点:
1.运行时需要加载库,可能会稍微增加启动时间
2.如果库文件被其他程序占用或损坏,可能会导致程序无法正常运行
动态链接库生成步骤
在了解了动态链接库的特点以及不同系统下的命名方式后,我们需要着手生成一个动态链接库文件:
1.使用-c命令生成汇编文件
//使用-c命令生成汇编文件
g++ -c -I "头文件路径" *.cpp
2.使用-shared命令生成动态链接库
//使用-shared命令生成动态链接库
g++ -o 动态链接库.dll -I "头文件路径" -fPIC -shared *.cpp

图3.生成动态链接库
动态链接库的使用
当使用命令生成一个可用的动态链接库后,我们需要将其源文件与动态链接库放到同一个目录中,然后根据头文件编写代码, 对动态库中的函数进行调用
1.将源文件与静态链接库链接产生可执行文件
//方法1
g++ 源文件.o -o 可执行文件名 动态链接库路径//方法2
g++ 源文件.o -o 可执行文件名 -L动态链接库路径//方法3,其中动态链接库名为除去lib和.dll的名称
//例如libfun.dll,其静态链接库名就为fun
g++ 源文件.o -o 可执行文件名 -L动态链接库路径 -l动态链接库名

图4.多种方法生成动态链接库可执行文件
PS:倘若出现未定义的头文件等错误,则可以参考静态链接库生成可执行文件的方法,使用-L与-l命令指定库地址
动态链接库无法加载
首先为啥这种无法加载的问题会出现在动态链接库?而不是静态链接库。是由于在生成可执行文件时,静态链接库会被打包到可执行程序中。当程序执行时,静态链接库库中的代码也会加载到系统的内存当中,因此不会出现静态链接库找不到无法被加载的问题
而动态链接库在打包时只是检测库文件是否存在,存在则打包,不存在则不打包。所以动态链接库并没有被打包到可执行文件中,只是在文件中记录了动态链接库的名字。所以当程序执行时,会存在动态链接库无法加载的问题
解决动态链接库无法加载问题
在Linux系统中,我们可以使用动态链接器来解决这个问题。动态链接器是一个在程序运行时负责链接程序与动态链接库的程序,其寻找链接库的步骤如下:
1.编译时指定路径:如果编译时通过特定的编译器选项(如在Linux中的-Wl,-rpath)指定了库的运行时搜索路径,动态链接器会首先在这些路径中搜索库
2.环境变量:动态链接器会检查环境变量来确定库的搜索路径。例如,在Linux系统中,LD_LIBRARY_PATH环境变量可以添加额外的库搜索路径;在Windows系统中,PATH环境变量用于搜索.dll文件
3.标准库目录:操作系统会预定义一些标准目录来存放系统级的库。例如,在Linux中,/lib和/usr/lib是常见的库目录;在Windows中,系统目录(如C:\Windows\System32)是搜索.dll文件的地方
4.可执行文件所在目录:动态链接器会搜索可执行文件所在的目录
解决方法如下:
1: 将库路径添加到环境变量LD_LIBRARY_PATH中:
1.找到相关的配置文件
~/.bashrc:用户路径,只对当前用户有效
/etc/profile:系统路径,对所有用户有效
2.修改配置文件
#添加动态链接库路径
export LD_LIBRARY_PATH =$LD_LIBRARY_PATH :动态链接库的绝对路径

图5.将库路径添加到环境变量LD_LIBRARY_PATH
3.执行更新命令
source ~/.bashrc //用户路径
source /etc/profile //系统路径//source命令用于执行指定文件
2.更新/etc/ld.so.cache文件:
1.打开ld.so.cache文件
sudo vim /etc/ld.so.conf
2.更新 /etc/ld.so.conf中的数据到 /etc/ld.so.cache 中
sudo ldconfig

图6.更新/etc/ld.so.cache文件
PS:关于动态链接库和静态链接库的生成与使用还需要更多的实践才能更灵活的运用,所以不要停留在纸上谈兵的阶段,计算机专业并不是什么文科,不需要通篇背诵,多实操,多练,多发现问题,多解决问题
相关文章:
Linux:动态库和静态库的编译与使用
目录 1.前言 2.静态链接库 3.静态链接库生成步骤 4.静态链接库的使用 5.动态链接库 6.动态链接库生成步骤 7.动态链接库的使用 8.动态链接库无法加载 9.解决动态链接库无法加载问题 前言 在《MinGW:从入门到链接库》博客中简单介绍了如何编译动态链接库和静态链接库…...
【Pyqt6 学习笔记】DIY一个二维码解析生成小工具
文章目录 Pycharm 配置QtDesignerPyUIC基本模板 代码示例依赖包main.pyscreen_shot_module.pyuntitled.pyuntitled.ui Pycharm 配置 摘自PyQT6的从零开始在Pycharm中配置与使用——蹦跑的蜗牛 pip install PyQt6 PyQt6-toolsQtDesigner File -> Settings -> External …...
关于xilinx srio ip复位问题
关于xilinx srio ip复位问题 语言 :Verilg HDL 、VHDL EDA工具: Vivado 关于xilinx srio ip复位问题一、引言二、FPGA 之间 srio通信复位处理复位时序不同步:SRIO 模块未正确初始化:等待复位完成的时间不足:SRIO 配置…...
04 uboot 编译与调试
新手不需要详细掌握 uboot,只需要知道它是一个什么东西即可,工作中也只是改一些参数而已。 1、uboot 是什么 Linux 系统要启动就必须需要一个 bootloader 程序,也就说芯片上电以后先运行一段 bootloader 程序。这段 bootloader 程序会先初始化 DDR 等外设,然后将 Linux 内…...
【机器学习】机器学习与医疗健康在智能诊疗中的融合应用与性能优化新探索
文章目录 引言机器学习与医疗健康的基本概念机器学习概述监督学习无监督学习强化学习 医疗健康概述疾病预测诊断辅助个性化治疗方案制定 机器学习与医疗健康的融合应用实时健康监测数据预处理特征工程 疾病预测与优化模型训练模型评估 诊断辅助与优化深度学习应用 个性化治疗方…...
在线OJ项目测试(selenium+Junit5)
目录 在线OJ项目测试的思维导图 在线OJ的UI自动化测试 测试一:检查未登录时的页面访问以及一些未登录时的非法操作 测试二:测试注册界面 测试三:测试登录界面 测试四:测试题目列表界面 测试五:测试题目详情界面…...
计算机系统基础笔记(12)——控制
前言 在持续输出ing 一、条件码 1.处理器状态(x86-64,部分的) 当前程序的执行信息 ◼ 临时数据 ◼ 运行时栈的位置(栈顶) ◼ 当前代码控制点的位置(即将要执行的指令地址) ◼ 最近一次指令执…...
使用RedissonClient的管道模式批量查询key
1.场景 遇到了一个场景,在客户给我们推送的数据中,咋1分钟左右,会有相同车辆vehicle 和时间 gpstime一样的数据,这类数据呢,我们认为是重复数据,需要过滤的 把相同 vehicle 和 gpstime 作为key存入到redis中…...
UR机器人通信汇总
文章目录 一、概述二、UR机器人通信2.1UR通信协议2.2 UR通信端口 三、UR机器人通信端口类型3.1 Modbus TCP端口(502端口)3.2 Dashboard端口(29999端口)3.3 上位机编程端口(30001/30002/30003端口)3.3.1 URS…...
AI学习指南机器学习篇-使用ID3算法构建决策树
AI学习指南机器学习篇-使用ID3算法构建决策树 介绍ID3算法 ID3(Iterative Dichotomiser 3)是一种用于构建决策树的经典机器学习算法。它是由Ross Quinlan于1986年提出的,是一种基于信息论的算法,用于从一组特征中选择最佳特征来…...
React实战(一)初始化项目、配置router、redux、axios
(一)初始化项目 1.安装项目 npx create-react-app 项目名 编译报错: 解决办法:安装最新的babel-preset-react-app npm install babel-preset-react-applatest 2.配置项目 (1)配置文件目录 (2)使用craco配置webpack.config npm install craco/crac…...
高质量 HarmonyOS 权限管控流程
高质量 HarmonyOS 权限管控流程 在 HarmonyOS 应用开发过程中,往往会涉及到敏感数据和硬件资源的调动和访问,而这部分的调用就会涉及到管控这部分的知识和内容了。我们需要对它有所了解,才可以在应用开发中提高效率和避免踩坑。 权限管控了…...
java里面封装https请求工具类2
其他写法 https://blog.csdn.net/weixin_44372802/article/details/132620809?spm1001.2014.3001.5501 encodeJson 是请求参数的密文格式(大公司都是要对请求参数加密的) ResponseBean 是自己或者对方定义的返回内容参数 public ResponseBean sendByEnc…...
前端面试题日常练-day59 【面试题】
题目 希望这些选择题能够帮助您进行前端面试的准备,答案在文末 1. 在PHP中,以下哪个符号用于比较两个值的相等性? a) b) c) d) ! 2. PHP中的预定义变量$_POST用于获取什么类型的数据? a) 用户的输入数据 b) 浏览器发送的请…...
计算机小问题(4)--关闭联想电脑的小组件
打开联想软件管家,关闭即可 (今天弄了好久才找到,记录一下)...
mac无法读取windows分区怎么办 苹果硬盘怎么读取
对于Mac电脑用户但有Windows系统使用需求的,我们可以通过Boot Camp启动转换助理安装Windows分区这个方案来解决,不过因为两个系统的磁盘格式不同,相应的也会产生一些问题,例如无法正常读取windows分区。下面本文就详细说明mac无法…...
【设计模式】JAVA Design Patterns——State(状态模式)
🔍目的 允许对象在内部状态改变时改变它的行为。对象看起来好像修改了它的类。 🔍解释 真实世界例子 当在长毛象的自然栖息地观察长毛象时,似乎它会根据情况来改变自己的行为。它开始可能很平静但是随着时间推移当它检测到威胁时它会对周围的…...
Docker搭建可道云
Docker搭建可道云(存储) 文章目录 Docker搭建可道云(存储)介绍资源列表基础环境一、安装Docker二、配置Docker加速器三、搭建可道云私有云盘3.1、编写Dockerfile3.2、上传资源到指定目录3.3、查看目录下所有资源 四、构建镜像五、…...
【RISC-V】站在巨人的肩膀上——看开源芯片、软件生态、与先进计算/人工智能/安全的结合
目录 会议议程前言开源处理器芯片的机遇与挑战,孙凝晖,中国工程院院士RISC-V原生基础软件栈,武延军,中国科学院软件研究所RISC-V推动新型架构创新,孟建熠,浙江大学 专题一:开源芯片开源高性能 R…...
test 判断字符串不为空
#!/bin/bash read -p "请输入参数:" name test -z $name if [ $? -eq 1 ]; then echo "入参:$name" else echo "入参为null" fi...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...
毫米波雷达基础理论(3D+4D)
3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文: 一文入门汽车毫米波雷达基本原理 :https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...
解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用
在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...
