dlopen与动态链接库的依赖

使用dlopen动态链接库的一个问题 当我们采用异步事件驱动模型,保证主程序逻辑不变,将各个业务用动态链接库的形式加载进来,这就是所谓的插件。linux和Windows提供了加载和处理动态链接库的系统调用,非常方便。该文章记录一个在使用过程中的问题。 1、Linux Linux提供了一套API来动态装载库: dlopen,打开一个动态库,并为使用该库做些准备。 dlsym,在打开的库中查找符号的值。 dlclose,关闭库。 dlerror,返回一个描述最后一次调用dlopen、dlsym,或dlclose的错误信息的字符串。 阅读详情

有两个动态链接库,其中一个依赖了另一个定义的函数,使用dlopen的时候,需要加上RTLD_GLOBAL。

 

动态库一,life,定义了一个life函数。

gcc -shared -Wl,-soname,liblife.so.1 -o liblife.so.1.0 life.c

---------------------------------------------------------------------

#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>

int life(int a)
{
    return a+8;
}

 

动态库二,printk,其中调用了动态库一定义的life函数。

gcc -shared -Wl,-soname,libprintk.so.1 -o libprintk.so.1.0 printk.c

----------------------------------------------------------------------

#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>

extern int life(int a);

void printk(char *con)
{
    printf("%s %d/n", con, life(1));
    return;
}

 

主程序,用dlopen打开了两个动态链接库

gcc -o foo foo.c -ldl

-------------------------------------------------------------------

#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>

int day(int a)
{
    return a+2;
}

int main(int argc, char **argv) {
    void *handle1, *handle2;
    void (*printk)(char *);
    int (*life)(int a);
    char *error;
    handle2 = dlopen ("./liblife.so.1.0", RTLD_LAZY | RTLD_GLOBAL );
    if (!handle2) {
        fprintf (stderr, "%s/n", dlerror());
        exit(1);
    }
    dlerror();    /* Clear any existing error */
    handle1 = dlopen ("./libprintk.so.1.0", RTLD_LAZY | RTLD_GLOBAL );
    if (!handle1) {
        fprintf (stderr, "%s/n", dlerror());
        exit(1);
    }
    dlerror();    /* Clear any existing error */
    life  = dlsym(handle2, "life");
    if ((error = dlerror()) != NULL)  {
        fprintf (stderr, "%s/n", error);
        exit(1);
    }
    printk  = dlsym(handle1, "printk");
    if ((error = dlerror()) != NULL)  {
        fprintf (stderr, "%s/n", error);
        exit(1);
    }
    printf("%d/n", life(1));
    printk("hhh");
    dlclose(handle1);
    dlclose(handle2);
    return 0;
}

 

深入剖析 self._handle = _dlopen(self._name, mode) OSError: [WinError 126] 的根源系统级修复 本文深入分析了Python在Windows系统中常见的`OSError: [WinError 126] 找不到指定的模块`错误,重点解析了`_dlopen`函数加载动态链接库失败的原因。文章提供了从基础排查到高级修复的系统级解决方案,包括检查DLL文件、分析依赖关系、调整环境变量等实用技巧,特别针对Conda环境下的特殊问题给出了专业建议。 阅读详情

相关推荐

CPU也能跑大模型?手把手教你用vLLM离线部署Qwen2.5-7B-Instruct(附性能优化技巧)

本文详细介绍了如何在CPU服务器上高效部署Qwen2.5-7B-Instruct模型,通过vLLM框架和一系列优化技巧实现离线推理。内容包括环境配置、模型加载优化、性能调优及生产环境部署方案,帮助开发者在资源有限的情况下也能运行大语言模型。

weixin_28691741的博客 457

ARM学习(27)链接库依赖学习(二)dlopen failed:library xxxx.so

链接装载学习

张一西的博客 2254

MagicDraw小白必看:BDD图中模块的5种属性详解(含SysML v1.6最新端口配置指南)

本文面向MagicDraw初学者,详细解析SysML BDD图中模块的五种核心结构属性,包括组成部分、引用、值、约束属性及端口。重点阐述了SysML v1.6中端口设计的范式转移,对比了完整端口代理端口的区别应用场景,并通过实战案例指导如何利用代理端口进行清晰的接口定义系统架构设计。

rum55的博客 342

Linux C++动态库so调用实例

test.cpp #include "stdio.h" extern "C" {         void print(); } void print(){         printf("songbai"); } class Lynn{         public:                 Lynn(); }; 编译:  g++

wsb1321的专栏 6333

linux下so动态库一些不为人知的秘密(中)

上一篇(linux下so动态库一些不为人知的秘密(上))介绍了linux下so一些依赖问题,本篇将介绍linux的so路径搜索问题。      我们知道linux链接so有两种途径:显示和隐式。所谓显示就是程序主动调用dlopen打开相关so;这里需要补充的是,如果使用显示链接,上篇文章讨论的那些问题都不存在。首先,dlopenso使用ldd是查看不到的。其次,使用dlopen打开的

qq_19436041的专栏 682

linux ubuntu dlopen,linux – 使用dlopen()加载共享库时出错

我正在开发一个程序,在CentOS上使用dlopen加载用户创建的插件.我遇到了一个插件的问题,该插件依赖于也具有依赖关系的共享库:libplugin.so – > libservices.so – > libconfig.so我们的程序首先将依赖项加载到内存中,从依赖树的叶子开始并向上移动到插件,(在此示例中省略了错误检查):dlopen("/path_to_plugin/lib...

weixin_35650074的博客 716

cmake动态库依赖强制依赖

cmake动态库依赖强制依赖

2185

dlopen动态链接库依赖 2

上一篇文章中讲到了 两个动态链接库,有依赖关系,在dlopen时,需要使用RTLD_GLOBAL。这样之前的symbol就可以被之后的动态库找到。这次说的是,动态链接库依赖了主程序中的symbol。 我们需要在编译时加上 -rdynamic 选项,就可以实现这个功能。

RichardYSteven的专栏 5662

[Sample]实现动态链接库(.so)的引用

本示例针对实际开发过程中需要引用三方so库的场景,提供了三种解决方案:通过编译动态链接库的方式、通过调用dlopen的方式和通过配置模块动态依赖的方式引用三方so库,帮助开发者将项目的不同功能模块化,提升代码的复用性和工程的可维护性。

Alexzhang369学习总结空间 440

linux下dlopen的使用

dlopen()   功能:打开一个动态链接库   包含头文件:   #include   函数定义:   void * dlopen( const char * pathname, int mode );     函数描述:   在dlopen的()函数以指定模式打开指定的动态连接库文件,并返回一个句柄给调用进程。使用dlclose()来卸载

cuiyifang的专栏 4933

鸿蒙5.0&next开发【三方动态链接库(.so)集成开发】NDK开发

在实际项目中,业务功能可能由不同“团队/组织”提供,如:团队A开发功能编译生成so库,团队B引用so库进行后续开发。so库可以将项目的不同功能模块化,提升代码的复用性和工程的可维护性。团队开发过程中引用三方so库的场景可分为两种:

zhenggaoxiao232的博客 1282

undefined reference to: xxx

总结一下原因: 1. 编译链接时 1> 库的搜索路径不对 a. 默认路径是:/lib,  /usr/lib/,  /usr/local/lib b. -L: 指定连接时动态库的路径 c. LD_LIBRARY_PATH:  指定连接路径 一般编译时用-L指明路径即可 2> 链接库之间有依赖关系,链接时顺序书写不对  // 在编译可执行程序或静态

finding的专栏 1192

鸿蒙代码实战【实现动态链接库(.so)的引用】

例针对团队实际开发过程中需要引用三方so库的场景,本示例提供三种解决方案,帮助开发者将项目的不同功能模块化,提升代码的复用性和工程的可维护性

zhenggaoxiao232的博客 687

如何理解 dlopen 的 RTLD_LOCAL flag?

本文通过一个 demo 程序来理解 dlopen 的 RTLD_LOCAL flag

龙瑜的博客 2420

Rust-dlopen 项目使用教程

Rust-dlopen 项目使用教程 1. 项目介绍 rust-dlopen 是一个用于在 Rust 中加载和使用动态链接库(也称为共享对象)的库。它旨在简化在 Rust 中使用动态链接库的过程,避免不安全的代码和过多的样板代码。该项目的目标是帮助开发者快速实现动态链接库的加载和调用,同时减少错误的发生。 2. 项目快速启动 安装依赖 首先,确保你已经安装了 Rust 和 Cargo。然后,在你的...

gitblog_00798的博客 596

.netcore在linux下使用P/invoke方式调用linux动态库

http://www.mamicode.com/info-detail-2358309.html .netcore下已经实现了通过p/invoke方式调用linux的动态链接库(*.so)文件 1 [DllImport(@"libdl.so.2")] 2 public static extern I...

weixin_30911809的博客 814

dlsym

转自:http://blog.const.net.cn/a/17154.htm https://blog.csdn.net/woyebuzhidao888/article/details/46634591 编译时候要加入 -ldl (指定dl库) dlopen 基本定义 功能:打开一个动态链接库[喝小酒的网摘]http://blog.const.net.cn/a/17154.htm 包含头文件: #include <dlfcn.h> 函数定义: void * dlopen( ...

TuxedoLinux的博客 1535

【亲测免费】 开源项目 rust-dlopen 指南

开源项目 rust-dlopen 指南 项目概述 rust-dlopen 是一个Rust库,旨在简化动态链接库(也称为共享对象)的打开和操作过程。它提供了一个更安全、易用的方式来加载外部库,并访问其中的函数。本指南将通过三个关键部分,深入解析这个项目的结构、启动文件以及配置方面。 1. 项目目录结构及介绍 主要目录文件 Cargo.toml: 这是Rust项目的元数据文件,包含了依赖项、版本...

gitblog_01112的博客 557

CMake中使用pthread的坑解决方案

这篇文章汇总了我最近踩的一个莫名其妙的坑:Linux下CMake中使用pthread支持多线程编程。 # 问题描述 问题的代码可以参考lanphon/test_thread_dlopen。总的来说,我需要建立一个动态链接库,a,然后在一个测试的可执行程序b中去调用a所提供的功能。一般而言,使用库有两种链接方式,静态链接和动态链接。动态链接则分为直接连接和使用API的方式打开库的方式链接。 问题就出现在最后一种情况。 程序b使用Linux下的dlopen()函数打开动态链接库liba.so,然后用dls

jinking01的专栏 1万+

基于MATLAB的指纹识别GUI+源码(高分毕设项目).zip

基于MATLAB的指纹识别GUI+源码(高分毕设项目).zip个人经导师指导并认可通过的高分毕业设计项目,评审分98分。主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。指纹识别过程被分为指纹预处理、特征提取和指纹匹配三个过程。指纹预处理:指纹预处理过程可以细分为指纹图像归一化、中值滤波、二值化、填补连接、细化、矫正缩放。特征提取:特征提取是指提取指纹的特征信息,包括分岔点个数、端点个数、短纹个数、闭环个数等。提取完特征信息后需去除伪特征信息。基于MATLAB的指纹识别GUI+源码(高分毕设项目).zip个人经导师指导并认可通过的高分毕业设计项目,评审分98分。主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。基于MATLAB的指纹识别GUI+源码(高分毕设项目).zip个人经导师指导并认可通过的高分毕业设计项目,评审分98分。主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。基于MATLAB的指纹识别GUI+源码

上一篇: block设备 发送一个bio的过程 2.6.36
下一篇: dlopen与动态链接库的依赖 2
RichardYSteven
博客等级 码龄19年 297粉丝 513原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值