当前位置: 首页 > 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.rkmt.cn/news/21205.html

相关文章:

  • OAM角色定义
  • 消灭重复代码的最佳实践
  • SpringBean实例化之前做点事情
  • javaLong类型在前端json数据损失精度
  • 校招面试官揭秘:我们到底在寻找什么样的技术人才?
  • 【黑马python】基础 5.Python 函数:参数 返回值 嵌套
  • linux 命令
  • 一试模拟试题(十七)problem 7 另(数竞相关)
  • 以后尽量多更新
  • 10/14
  • newDay10
  • [Mysql]快速执行sql文件
  • 腾讯电脑管家C盘占用很大
  • SpringDataElasticsearch聚合实现过滤搜索
  • Python 并发编程:concurrent.futures
  • 2025/10/14 模拟赛总结 - sb
  • 记一次因对象构造顺序引发的踩内存问题
  • 恒流电路的震荡问题
  • Rust 的英文数字验证码识别系统设计与实现
  • IOS开发 - UIViewController 界面控制基类解析
  • CSP-S模拟31
  • 实用指南:【53道前端必考】JavaScript 基础面试题
  • 拼接字符串要求字典序最小
  • 20251013 模拟赛 总结
  • C#实现开机自启动应用多种方式
  • 什么是反应式编程 - 详解
  • SDL3和其附属的编译记录
  • 机器学习比赛
  • 牙科诊所借力AI营销4个月创收13万
  • P4653 [CEOI 2017] Sure Bet