Linux应用编程-动态加载动态库 dlopen dlsym dlclose

        使用so动态库时,可以在编译时链接动态库,也可以在代码运行时动态加载so库。本文主要介绍如何动态加载so库。

常用的函数主要有dlopen,dlysm,dlclose,dlerror。

一、函数介绍

1、dlopen函数

void * dlopen( const char * pathname, int mode)

  • 功能:打开动态库返回句柄
  • pathname:so动态库的路径,可以是相对路径
  • mode:选项配置
常用mode功能
RTLD_LAZY在dlopen返回前,对于动态库中存在的未定义的变量(如外部变量extern,也可以是函数)不执行解析,就是不解析这个变量的地址
RTLD_NOW

在dlopen返回前,解析出每个未定义变量的地址,如果解析不出来,在dlopen会返回NULL,错误为:

: undefined symbol: xxxx.......

其他mode详解参考https://www.cnblogs.com/ho966/p/17366207.html
  • 返回值:动态库的句柄

2、dlsym函数

void *dlsym(void *handle, const char *symbol)

  • 功能:根据给定的符号名称查找对应的符号地址,例如函数名会返回函数地址
  • handle:dlopen打开的动态库的句柄
  • symbol:需要查找的符号名称
  • 返回值:symbol符号地址

3、dlclose函数

int dlclose (void *__handle)

  • 功能:关闭__handle句柄

4、dlerror函数

char *dlerror (void)

  • 功能:检查上次调用是否成功,成功返回NULL,失败返回出错信息

二、实例

1、编译生成so库

#include <stdio.h>

/* 加 */
int cal_add(int a,int b)
{
    return (a + b);
}

/* 减 */
int cal_sub(int a, int b)
{
    return (a - b);
}

/* 乘 */
int cal_mul(int a, int b)
{
    return (a * b);
}

/* 除 */
int cal_div(int a, int b)
{
    return (a / b);
}

编译,生成自定义的 libcalculate.so 库

$ gcc -fPIC -shared calculate.c -o libcalculate.so

2、动态加载so库

动态加载 libcalculate.so 库,获取 cal_add 加法函数并调用

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

typedef int (*FUNC)(int, int);
int main(int argc, char* argv[])
{
    void *lib;
    FUNC lib_func = NULL;
    int temp1, temp2, result;

    if (argc != 3) {
        printf("param error!!!");
		return -1;
    }

    temp1 = strtol(argv[1], NULL, 10);
    temp2 = strtol(argv[2], NULL, 10);

    /* 打开动态链接库 */
    lib = dlopen("./libcalculate.so", RTLD_LAZY);
	if (lib == NULL) {
		printf("%s dlopen failed: %s\n", "libcalculate.so", dlerror());
    }

    /* 获取库函数 */
    lib_func = dlsym(lib, "cal_add");       
    if (!lib_func) {
        printf("can't find module symbol: %s\n", dlerror());
    }
    
    /* 调用库函数 */
	result = lib_func(temp1, temp2);
    printf("result: %d\n", result);

    return 0;
}

编译应用程序, 需要加上"-ldl"库,才能调用dlopen、dlclose等函数

$ gcc -o test_app main.c -ldl                #编译生成 test_app 可执行文件

3、测试结果

./test_app 3 8                                #运行应用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/729838.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

不清楚数据治理路线图怎么制定?跟随这个思路即可

我们已迈入一个数据驱动的时代&#xff0c;企业的数据不仅数量庞大&#xff0c;而且种类繁多&#xff0c;它们来源于不同的业务流程、客户互动和运营系统。数据已成为企业决策的核心&#xff0c;是推动创新和竞争优势的关键资源。然而&#xff0c;随着数据量的爆炸性增长&#…

ubuntu多版本cuda如何指定cuda版本

本文作者&#xff1a; slience_me ubuntu多版本cuda如何指定cuda版本 文章目录 ubuntu多版本cuda如何指定cuda版本1. 关于cuda设置1.1 查看当前安装的 CUDA 版本1.2 下载并安装所需的 CUDA 版本1.3 设置环境变量1.4 验证切换1.5 安装对应的 NVIDIA 驱动程序 2. 设置环境变量2.1…

mysql学习——SQL中的DDL和DML

SQL中的DDL和DML DDL数据库操作&#xff1a;表操作 DML添加数据修改数据删除数据 学习黑马MySQL课程&#xff0c;记录笔记&#xff0c;用于复习。 DDL DDL&#xff1a;Data Definition Language&#xff0c;数据定义语言&#xff0c;用来定义数据库对象(数据库&#xff0c;表&…

计算机网络 MAC地址表管理

一、理论知识 1.MAC地址表&#xff1a;交换机使用MAC地址表来记录各MAC地址对应的端口&#xff0c;用于帧转发的目的。 2.老化机制&#xff1a;交换机会为每一条MAC地址表项设置老化时间&#xff0c;老化时间到期后未收到该MAC地址报文的表项将被删除&#xff0c;释放资源。 …

【日记】梦到兄长要给鳄鱼换牙齿……(421 字)

正文 今天中午睡了一个小时多一点&#xff0c;做了一个很奇怪的梦。梦见兄长要给一条鳄鱼换牙齿&#xff0c;还说早上不好操作&#xff0c;要三天之后的中午或晚上&#xff0c;颇有一种翻黄历寻个良辰吉日之感。但我没那样大的耐性&#xff0c;便捏住鳄鱼的嘴&#xff0c;左摔右…

ip地址怎么写才是的对的?合法ip地址正确的格式

IP地址怎么写才是的对的&#xff1f;在互联网的世界里&#xff0c;IP地址就像是我们生活中的门牌号码&#xff0c;它是每个设备在网络中的唯一标识。正确的书写IP地址对于确保网络通信的顺畅至关重要。本文将带您了解合法IP地址的正确格式与书写规范&#xff0c;并深入探讨其在…

Elastisearch集群(单节点)

目录 一、文件下载 二、创建linux es用户 三、上传、解压canal、es、kibana 四、配置es通讯证书&#xff08;生成证书给es配置使用&#xff09; 五、配置elastisearch 六、修改系统配置 七、添加ik分词器支持&#xff08;可选&#xff09; 八、给文件赋值权限 九、设置…

error: ‘CV_YUV2BGR_UYVY‘ was not declared in this scope

遇到这个问题时&#xff0c;按照如下修改可解决问题。 //cv::cvtColor(yuvImg, rgbImg, CV_YUV2BGR_UYVY);cv::cvtColor(yuvImg, rgbImg, cv::COLOR_YUV2RGB_UYVY);

Syslog日志外发

Syslog是一种广泛应用于网络设备、操作系统和应用程序的日志通信协议&#xff0c;通过收集、监控和分析Syslog日志&#xff0c;企业可以有效维护网络安全、故障排除和运营管理。 除了内部监控&#xff0c;有时企业也需要将Syslog日志外发以实现更多的管理和合规需求。在实现Sy…

网络安全之Windows提权(上篇)(高级进阶)

目录 一&#xff0c;什么是提权&#xff1f; 二&#xff0c;提权的前提 三&#xff0c;如何提权&#xff1f; 1&#xff0c;第一步连接服务器 2&#xff0c;提升权限至iuser​编辑 3&#xff0c;利用补丁漏洞提权至最高级 四&#xff0c;总结 一&#xff0c;什么是提权&am…

vue:vue2与vue3如何全局注册公共组件(包括涉及到的相关方法函数的讲解)

目录 第一章 vue2全局注册公共组件 1.1 方法一&#xff1a;逐个注册 1.2 方法二&#xff1a;批量注册 1.2.1 require.context()方法解释 第二章 vue3全局注册公共组件 1.1 方法一&#xff1a;逐个注册 1.2 方法二&#xff1a;批量注册 第一章 vue2全局注册公共组件 Vue…

超级ai 必须有个,超级大的词表,必须是个向量库 faiss is all you need

说明优点图像表示流程代码实现如下全部代码 说明 使用极其庞大的词表在模型压缩和图像token化方面带来了显著优势。由于词表巨大&#xff0c;我们不得不利用向量数据库对词表进行搜索&#xff0c;以找到最匹配的token。预测出的token会再次通过嵌入矩阵&#xff08;em&#xf…

高效管理:好用的项目管理工具推荐

在当今快速变化的商业环境中&#xff0c;高效的项目管理工具能够显著提升团队的生产力和项目的成功率&#xff0c;还能有效地跟踪项目进度。所以&#xff0c;一款优秀的项目管理工具首先要具备先进的项目管理理念&#xff0c;支持多种研发管理和项目管理方法论&#xff0c;才能…

扭转引伸计技术资料YYJ-10 6-N

一、 工作原理 利用专门设计的扭转引伸计夹持系统&#xff0c;可靠地装夹在试样上&#xff0c;采用应变片夹式引伸计进行机械量与电信号的转换&#xff0c;使之完成扭转应变的自动测试。 二、技术指标 1、扭转引伸计的标距&#xff1a;该装置分别配置50mm、100mm标距联接延伸横…

HALCON-从入门到入门-霍夫识别直线

1.废话 霍夫变换是一种特征检测&#xff0c;被广泛应用在图像分析、计算机视觉以及数位影像处理。霍夫变换是用来辨别找出物件中的特征&#xff0c;例如&#xff1a;线条。他的算法流程大致如下&#xff0c;给定一个物件、要辨别的形状的种类&#xff0c;算法会在参数空间中执…

网络编程及练习

定义&#xff1a; 在网络通信协议下&#xff0c;不同计算机上运行的程序进行的数据传输。计算机和计算机之间通过网络进行数据传输 可以使用在java.net包下的技术开发出常见的网络应用程序 常见的软件架构&#xff1a; C/S: Client/Server 客户端/服务器 在用户本地需要下载…

matplotlib 创建多个子图

有些时候我们需要用for循环来创建多个子图&#xff0c;来对比特征。现在已画出8组随机数来作为示例。 from matplotlib import pyplot as plt import numpy as np #设置画布大小 figplt.figure(figsize(20,8)) #解决中文乱码问题 plt.rcParams[font.sans-serif] [SimHei] fo…

视频智能分析平台智能边缘分析一体机安防监控平台打手机检测算法工作原理介绍

智能边缘分析一体机的打手机检测算法是一种集成了计算机视觉和人工智能技术的先进算法&#xff0c;专门用于实时监测和识别监控画面中的打手机行为。以下是关于该算法的详细介绍&#xff1a; 工作原理 1、视频流获取&#xff1a; 智能边缘分析一体机首先通过连接的视频监控设…

Ubuntu 18.04 安装 PCL 1.14.1

在进行科研项目时&#xff0c;我们常常需要将 C 和 Python 结合起来编程。然而&#xff0c;每次将 PCL&#xff08;Point Cloud Library&#xff09;的内容添加到 CMakeLists.txt 文件中时都会报错。在深入分析后&#xff0c;我们推测可能是当前使用的 PCL 1.8 版本与现有程序不…

【Linux】rouyiVue 项目部署全过程(含MySQL,Nginx等中间件部署)

查看nginx 进程命令 ps aux | grep server_name 1. 安装MySQL 1.1 下载压缩包 官网下载 1.2 解压 上传并解压好放在指定位置 创建soft文件夹 mkdir /soft上传文件&#xff0c;在该目录下再创建一个mysql文件夹&#xff0c;将安装包解压到新文件夹中 mkdir /soft/mysql-…