动态库的调用方式

news/2025/10/15 0:03:47/文章来源:https://www.cnblogs.com/happykino/p/19142319

在 Linux 中,动态库(.so文件)的调用方式主要有两种:编译时链接(隐式调用)和运行时加载(显式调用)。

一、编译时链接(隐式调用)

这种方式在编译阶段就指定动态库,程序启动时会自动加载依赖的动态库,适用于已知库路径和接口的场景。

  • 步骤 1:创建动态库源文件
    首先实现一个简单的动态库,包含两个接口函数。

  • 步骤 2:编译生成动态库
    使用g++编译生成.so文件:
# 编译为位置无关代码(-fPIC),生成动态库(-shared)
g++ -fPIC -shared mylib.cpp -o libmylib.so

生成libmylib.so动态库(Linux 动态库命名规范:lib+库名+.so)。

  • 步骤 3:编写调用动态库的程序

  • 步骤 4:编译程序并链接动态库
# -L. 表示在当前目录查找动态库,-lmylib 表示链接libmylib.so
g++ main.cpp -o main -L. -lmylib

+ 步骤 5:运行程序 运行前需确保系统能找到动态库(否则会报 “找不到共享库” 错误):
# 临时指定动态库搜索路径(当前目录)
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH#运行程序
./main

二、运行时加载(显式调用)

这种方式不依赖编译时链接,而是在程序运行中通过系统函数动态加载库并调用接口,适用于库路径不确定或需要动态切换库版本的场景(如插件系统)。

  • 步骤 1:使用相同的动态库
    复用前面生成的libmylib.so(无需修改)。

  • 步骤 2:编写显式调用的程序
    通过dlopen、dlsym、dlclose等函数手动加载和调用动态库。

  • 步骤 3:编译程序
    显式调用需要链接dl库(动态加载系统库)
g++ main_dl.cpp -o main_dl -ldl
  • 步骤 4:运行程序
    同样需要指定动态库路径
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
./main_dl

输出结果与隐式调用相同。

三、两种调用方式对比

img

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

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

相关文章

动态库的调用方式

在 Linux 中,动态库(.so文件)的调用方式主要有两种:编译时链接(隐式调用)和运行时加载(显式调用)。 一、编译时链接(隐式调用) 这种方式在编译阶段就指定动态库,程序启动时会自动加载依赖的动态库,适用于已…

云原生技术概览

云原生技术概览书籍:https://jimmysong.io/kubernetes-handbook/从云计算到微服务再到云原生计算 下面将从云计算的发展历程引入云原生计算 云计算介绍 云计算演进历程云计算就是一种配置资源的方式,根据资源配置方式…

OAM角色定义

OAM角色定义https://github.com/oam-dev/spec/blob/master/introduction.md关注点分离 开放应用程序模型提出了开发人员负责的部分与平台工程师负责的部分之间明确的关注点分离。 Open Application Model proposed a c…

OCI

OCI【译者的话】本文介绍了OCI运行时和镜像规范,以及在过去的一段时间里大家对该规范的一些误解。OCI规范制订工作尚未落幕,未来也将对容器产生更加深远的影响。 【3 天烧脑式基于Docker的CI/CD实战训练营 | 北京站】…

消灭重复代码的最佳实践

消灭重复代码的最佳实践代码重复本身不可怕,可怕的是漏改或改错。消灭重复代码,降低改动可能引入的风险。学习笔记:https://time.geekbang.org/column/article/228964工厂模式 + 模板方法 消除 if else 和重复代码 …

Spring应用上下文的获取和保存Bean

Spring应用上下文的获取和保存BeanSpring 容器是 IOC 容器,但是,反过来却不成立不常用的容器实现 -- BeanFactory:最简单的容器,提供基本的 DI 功能 高级实现,继承 BeanFactory 派生的应用上下文 -- ApplicationC…

Redis的数据类型选择

Redis的数据类型选择String 几乎所有的数据都可以使用 String 来存储。浪费存储空间,key 也是需要存储空间的 管理、维护成为噩梦,Redis 中存在着大量的 KV 对象 key 冲突的几率变高(不同的业务系统共用一个 Redis …

pipeline解决Redis频繁命令往返导致的性能瓶颈

pipeline解决Redis频繁命令往返导致的性能瓶颈客户端和服务端交互模型Redis 的 pipeline 交互模型Redis pipeline 与原生批量mset等等命令对比原生批量命令是原子性,pipeline 是非原子性的 原生批量命令一次只能执行一…

SpringBean实例化之前做点事情

SpringBean实例化之前做点事情SpringBean 实例化 需求,实现一个视频解码器,可以实现各种视频格式的解码 第一种方法:先去实现各个解码器,然后 if.else 判断使用哪种解码器使用 BeanPostProcessor 优化 第二种方法:…

SpringBoot定时任务不定时执行了

SpringBoot定时任务不定时执行了两个注解 @EnableScheduling:使得@Scheduled生效 @Scheduled:标注在方法上 @Scheduled 注解 fixedDelay任务结束与开始之间的间隔 fixedRate两次任务的开始的间隔,不管任务是不是执行…

依赖冲突的发现和解决

依赖冲突的发现和解决依赖冲突的发现现象一:一个类的行为不按照预期,本来这个类应该是有这个方法的,但是引入一个新的依赖之后就开始报错找不到方法了,一般就是依赖冲突的时候 Maven 自己选择了一个不符合自己预期…

javaLong类型在前端json数据损失精度

javaLong类型在前端json数据损失精度方法一:重新生成pojo对象,将所有数据库类型为bigint都映射成String类 方法二:对于使用springboot,则增加配置代码: package com.gj.app.config;import com.fasterxml.jackson.…

校招面试官揭秘:我们到底在寻找什么样的技术人才?

🎯 校招面试官揭秘:我们到底在寻找什么样的技术人才?又是一年校招季!📚 作为技术团队的Leader,这段时间我面试了不少优秀的同学。有人拿到心仪offer,也有人遗憾错过机会...今天想从面试官的角度,和大家聊聊我…

时间格式不能正常转换?

时间格式不能正常转换?@DateTimeFormat 注解 前台到后台的时间格式转换,对于GET 请求参数可以正常工作。对于 POST 请求会报反序列化错误POST 请求会使用 JSON 反序列化,不会使用 @DateTimeFormat 注解。POST 表单(…

群发红包系统

群发红包系统业务流程 发红包输入金额以及人数 创建红包订单(订单ID,金额,份数) 调用支付系统 红包订单支付之后红包就发出去了 钱先拆好(行锁分散,加大并发)抢红包抢红包业务群,检测当前是否有剩余钱 没有剩余…

day011

今日完成:mysql的初步认识以及cmd指令操作 明日完成:mysql 遇到问题:无

【黑马python】基础 5.Python 函数:参数 返回值 嵌套

笔记汇总目录【黑马python】8天python从入门到精通 - 汇总Python 函数代码示例代码示例代码示例代码示例代码示例代码示例代码示例代码示例代码示例代码示例代码示例代码示例代码示例参考链接黑马-4.Python 循环语句 0…

linux 命令

tar 命令 1、创建归档文件:将文件 file1、file2 和 directory 打包到一个名为 archive.tar 的归档文件中。 tar -cvf archive.tar file1 file2 directory-c: 创建新的归档文件-v: 显示详细输出,列出被添加到归档中的…

一试模拟试题(十七)problem 7 另(数竞相关)

一试模拟试题(十七)problem 7 另: 求式子 \(T = \sqrt{\cfrac{5-3 \sin \theta}{5+3 \cos \theta}}\) 的最大值 易知可以转化为点 \(P(5,5)\) 到以原点 \(O\) 为圆心,半径为 \(3\) 的圆的切线的斜率(较大的那一个…

PaddleOCR源码安装+centos7.6+python3.10

先自行安装python3,版本如下:[root@localhost IOPaint]# python3 --version Python 3.10.6安装gcc9# 安装 SCL 仓库 sudo yum install -y centos-release-scl# 安装 devtoolset-9(包含 GCC 9) sudo yum install -y…