当前位置: 首页 > news >正文

动态库的调用方式

在 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.jsqmd.com/news/13769/

相关文章:

  • 云原生技术概览
  • OAM角色定义
  • OCI
  • 消灭重复代码的最佳实践
  • Spring应用上下文的获取和保存Bean
  • Redis的数据类型选择
  • pipeline解决Redis频繁命令往返导致的性能瓶颈
  • SpringBean实例化之前做点事情
  • SpringBoot定时任务不定时执行了
  • 依赖冲突的发现和解决
  • javaLong类型在前端json数据损失精度
  • 校招面试官揭秘:我们到底在寻找什么样的技术人才?
  • 时间格式不能正常转换?
  • 群发红包系统
  • day011
  • 【黑马python】基础 5.Python 函数:参数 返回值 嵌套
  • linux 命令
  • 一试模拟试题(十七)problem 7 另(数竞相关)
  • PaddleOCR源码安装+centos7.6+python3.10
  • 以后尽量多更新
  • 10/14
  • 算法模版
  • newDay10
  • C#/.NET/.NET Core技术前沿周刊 | 第 57 期(2025年10.1-10.12)
  • Cheap Context and Expensive Context
  • [Mysql]快速执行sql文件
  • 元类编程
  • 1014
  • 腾讯电脑管家C盘占用很大
  • 10.14日学习笔记