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

Linux 动态库热加载

📌 什么是热加载(Hot Reload)

  • 指主程序在不重启的前提下,通过动态方式加载(或重新加载)动态库(.so 文件),使得逻辑可以在运行时替换或更新。
  • 热加载通常需要重新编译 .so,但不需要重新运行主程序

🛠 基本流程

// 加载库
void* handle = dlopen("libplugin.so", RTLD_LAZY);// 获取函数地址
typedef int (*AddFunc)(int, int);
AddFunc add = (AddFunc)dlsym(handle, "add");// 使用函数
int result = add(1, 2);// 卸载库(如需重新加载新版)
dlclose(handle);

🔧 主要系统函数说明(<dlfcn.h>)

函数名作用
dlopen加载动态库,返回句柄 void*
dlsym从句柄中查找符号(函数或变量)地址
dlclose卸载已加载的动态库
dlerror获取最近一次 dlopen / dlsym / dlclose 的错误信息

示例:

void* handle = dlopen("libplugin.so", RTLD_LAZY);
if (!handle) {fprintf(stderr, "dlopen error: %s\n", dlerror());
}

⚠️ extern “C” 的必要性

  • C++ 编译器会对函数名做“名称修饰”(name mangling),导致 dlsym 无法识别函数名。
  • 加上 extern "C" 让函数以 C 的方式导出,无名称修饰。
extern "C" int add(int a, int b);

📦 动态库函数的参数设计建议

参数类型是否推荐说明
int, float简单类型,兼容性好
const char*字符串以 C 风格传递
void*通用指针,可用于传结构体地址等
std::string不推荐,C++ 类型,ABI 不稳定
std::vector不推荐,使用裸数组 + size 替代
自定义 struct⚠️结构体需对齐一致、layout 固定

🌀 动态更新库的流程(热加载)

  1. 主程序运行;
  2. 加载 libplugin.so
  3. 程序运行中,卸载该库(dlclose);
  4. 替换或重新编译 libplugin.so
  5. 主程序再次加载,即可使用新逻辑。

🧪 编译示例

1. 动态库(plugin.cpp)

extern "C" int add(int a, int b) {return a + b;
}
g++ -fPIC -shared -o libplugin.so plugin.cpp

2. 主程序(main.cpp)

#include <dlfcn.h>
#include <iostream>typedef int (*AddFunc)(int, int);int main() {void* handle = dlopen("./libplugin.so", RTLD_LAZY);if (!handle) {std::cerr << "dlopen failed: " << dlerror() << std::endl;return 1;}AddFunc add = (AddFunc)dlsym(handle, "add");if (!add) {std::cerr << "dlsym failed: " << dlerror() << std::endl;dlclose(handle);return 1;}std::cout << "1 + 2 = " << add(1, 2) << std::endl;dlclose(handle);return 0;
}
g++ main.cpp -ldl -o main

相关文章:

  • 计量——异方差的检验及其修正
  • 报考叉车证需要参加哪些培训和考试?
  • 24小时不打烊的知识宝库——RFID智能书柜
  • SpringBoot 3.4.5版本导入Lomobok依赖后无法生效的问题
  • Vuex和Vue的区别
  • 计算机组成与体系结构:替换策略(MRU LRU PLRU LFU)
  • WebRTC技术下的EasyRTC音视频实时通话SDK,助力车载通信打造安全高效的智能出行体验
  • HDFS的概述
  • 竞品分析是什么,包括哪些内容?AI竞品分析生成器推荐!
  • 人工智能、深度学习、机器学习的联系与区别
  • 英语学习笔记
  • Java零基础学习Day14——面向对象进阶
  • 算法图表总结:查找、排序与递归(含 Mermaid 图示)
  • ORACLE 11.2.0.4 数据库磁盘空间爆满导致GAP产生
  • 力扣.1471数组的k个最强值,力扣.1471数组的k个最强值力扣1576.替换所有的问号力扣1419.数青蛙​编辑力扣300.最长递增子序列
  • 小程序映射逻辑处理
  • day 17 无监督学习之聚类算法
  • 各编程语言对正则表达式标准的支持对比
  • Python生成器:高效处理大数据的秘密武器
  • k8s(12) — 版本控制和滚动更新(金丝雀部署理念)
  • 俄媒:俄乌伊斯坦布尔谈判将于北京时间今天17时30分开始
  • 昆明公布3起经济犯罪案例:一人持有820余万假美元被判刑十年
  • 泽连斯基:乌代表团已启程,谈判可能于今晚或明天举行
  • 讲武谈兵|视距外的狙杀:从印巴空战谈谈超视距空战
  • 秘鲁总统任命前司法部长阿拉纳为新总理
  • 十年磨一剑!上海科学家首次揭示宿主识别肠道菌群调控免疫新机制