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

C语言调用两个lib中的同名函数

在C语言中,如果你需要调用两个库中的同名函数,这会引起问题,因为链接器在连接阶段会遇到符号冲突。

解决办法

        可以 dlopen 动态加载库,并使用 dlsym 获取函数指针。这样可以避免符号冲突,并且你可以分别调用两个库中的同名函数。

举个例子:假设有两个库 libA.so 和 libB.so,每个库中都有一个名为 foo 的函数。

#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>// 定义函数指针类型
typedef void (*foo_func)();int main() {// 打开libA.sovoid* handleA = dlopen("./libA.so", RTLD_LAZY);if (!handleA) {fprintf(stderr, "%s\n", dlerror());exit(EXIT_FAILURE);}// 获取libA.so中的foo函数foo_func fooA = (foo_func)dlsym(handleA, "foo");if (!fooA) {fprintf(stderr, "%s\n", dlerror());exit(EXIT_FAILURE);}// 打开libB.sovoid* handleB = dlopen("./libB.so", RTLD_LAZY);if (!handleB) {fprintf(stderr, "%s\n", dlerror());exit(EXIT_FAILURE);}// 获取libB.so中的foo函数foo_func fooB = (foo_func)dlsym(handleB, "foo");if (!fooB) {fprintf(stderr, "%s\n", dlerror());exit(EXIT_FAILURE);}// 调用libA.so中的foo函数fooA();// 调用libB.so中的foo函数fooB();// 关闭库dlclose(handleA);dlclose(handleB);return 0;
}

总结

使用动态加载库(dlopen 和 dlsym)不仅能解决符号冲突,还能在运行时灵活加载和卸载库。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • React 组件间共享数据
  • 【lc_hot100】刷题心得
  • 2024网络安全学习路线,最全保姆级教程,学完直接拿捏!
  • LabVIEW中Request Deallocation 功能
  • 关于汽车加油是加200还是加满的思考
  • 小红书商品详情API:引领电商新时代,精细把控商品呈现革新
  • 我用 GPT 学占星
  • Vue 的常用指令以及相关修饰符的含义
  • Shell 编程入门
  • WPF中创建横向的ListView
  • 一文理解单点登录与联合登录
  • 数字影像产业基地:绿色、智能、创新,如何并存发展?
  • C++:拷贝构造函数、赋值运算符重载
  • 批量复制指定文件夹——EXCEL VBA 实现
  • 华纳云:修复WordPress内存耗尽错误的常用方法有哪些?
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • express.js的介绍及使用
  • k个最大的数及变种小结
  • Laravel核心解读--Facades
  • node学习系列之简单文件上传
  • Vue实战(四)登录/注册页的实现
  • 阿里云购买磁盘后挂载
  • 从setTimeout-setInterval看JS线程
  • 基于HAProxy的高性能缓存服务器nuster
  • 记录一下第一次使用npm
  • 前端之Sass/Scss实战笔记
  • 突破自己的技术思维
  • 我建了一个叫Hello World的项目
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • 通过调用文摘列表API获取文摘
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • #14vue3生成表单并跳转到外部地址的方式
  • (12)Hive调优——count distinct去重优化
  • (2024,Flag-DiT,文本引导的多模态生成,SR,统一的标记化,RoPE、RMSNorm 和流匹配)Lumina-T2X
  • (33)STM32——485实验笔记
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (C)一些题4
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (备份) esp32 GPIO
  • (笔记)M1使用hombrew安装qemu
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (回溯) LeetCode 40. 组合总和II
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (三)elasticsearch 源码之启动流程分析
  • (十六)视图变换 正交投影 透视投影
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • (转)ORM
  • . Flume面试题
  • .NET Core 和 .NET Framework 中的 MEF2
  • .NET Core中的去虚
  • .net 获取url的方法
  • .Net 中Partitioner static与dynamic的性能对比
  • .NET设计模式(11):组合模式(Composite Pattern)
  • @Pointcut 使用