Linux C++ 动态加载共享库

【C++】 dlopen 和dlsys dlopen是一款Unix系列操作系统下的动态链接库函数,它的主要功能是在程序运行时动态加载指定的共享库(也可称为动态链接库)dlsym是从库中查找函数或者变量。 阅读详情
编译时需要 链接库 dl

dlopen()

dlopen函数打开一个函数库然后为后面的使用做准备。C语言原形是:

void * dlopen(const char *filename, int flag);

如果文件名filename是以“/”开头,也就是使用绝对路径,那么dlopne就直接使用它,而不去查找某些环境变量或者系统设置的函数库所在的目录了。否则dlopen()

就会按照下面的次序查找函数库文件:

1. 环境变量LD_LIBRARY指明的路径。
2. /etc/ld.so.cache中的函数库列表。
3. /lib目录,然后/usr/lib。不过一些很老的a.out的loader则是采用相反的次序,也就是先查/usr/lib,然后是/lib。

Dlopen()函数中,参数flag的值必须是RTLD_LAZY或者RTLD_NOW,
    RTLD_LAZY的意思是resolve undefined symbols as code from the dynamic library is executed,
    而RTLD_NOW的含义是resolve all undefined symbols before dlopen() returns and fail if this cannot be done'。
    注意: 如果加载的动态库还依赖其他的动态库,必须使用
RTLD_NOW

如果有好几个函数库,它们之间有一些依赖关系的话,例如X依赖Y,那么你就要先加载那些被依赖的函数。例如先加载Y,然后加载X。

dlopen()函数的返回值是一个句柄,然后后面的函数就通过使用这个句柄来做进一步的操作。如果打开失败dlopen()就返回一个NULL。如果一个函数库被多次打开,它会返回同样的句柄。

如果一个函数库里面有一个输出的函数名字为_init,那么_init就会在dlopen()这个函数返回前被执行。我们可以利用这个函数在我的函数库里面做一些初始化的工作。我们后面会继续讨论这个问题的。



 
linux下python调用C++动态库以及库函数 C++:首先C++需要编译成动态共享库C++代码(cpptest.cpp)如下------#include<iostream>using namespace std;extern "C"{//在extern “C”中的函数才能被外部调用int test(){    cout<<"cpp文件已经被调用"<<endl; return 0; }}终端下编译命令:g++... 阅读详情

相关推荐

GDB动态库调试实战:从符号加载到内存映射的完整指南

本文详细介绍了GDB动态库调试的完整指南,涵盖从符号加载到内存映射的核心技术。通过实战案例解析动态库调试的三大挑战:符号可见性、内存映射定位和多架构兼容,重点讲解`info sharedlibrary`、`add-symbol-file`等关键命令的使用技巧,帮助开发者高效解决Linux环境下的动态链接库调试问题。

weixin_29162439的博客 627

使用dlopenC++动态库的函数符号的常规做法

在 C 中,符号名称与函数名称相同:strcpy 的符号将是 strcpy,因为在 C 中没有两个非静态函数可以具有相同的名称。因为 C++ 允许重载(具有相同名称但不同参数的不同函数)并且具有许多 C 所没有的功能(如类、成员函数、异常规范),所以不可能简单地使用函数名称作为符号名称。C++ 有一个特殊的关键字来声明具有 C 绑定的函数:extern “C”。声明为 extern “C” 的函数使用函数名称作为符号名称,就像 C 函数一样。因此,只有非成员函数可以声明为 extern “C”,并且不能重载

喜欢打篮球的普通人 1265

Linux C/C++ 插件化开发踩坑记:dlopen加载的so库依赖另一个so,为啥总报undefined symbol?

本文深入探讨了Linux C/C++插件化开发中`dlopen`加载动态库时遇到的`undefined symbol`错误问题。通过分析动态链接器的工作机制和符号解析规则,提供了构建时依赖声明、运行时加载策略等工程化解决方案,并分享了高级调试技巧和性能优化建议,帮助开发者有效解决共享库依赖管理难题。

weixin_29243063的博客 124

dlopen API 动态地加载 C++

if (!handle) {return 1;}dlerror();return 1;}hello();}}

hhappy0123456789的博客 459

BIM Revit教程(六)尝试安装 Revit 时显示“Autodesk Revit 已安装。”

在安装Revit或RevitLT时,若系统提示“AutodeskRevit版本已安装”,通常是由于旧版本残留文件未完全清除所致。解决方案包括:1.通过控制面板或Windows设置卸载旧版本Revit,确保所有相关组件被移除;2.使用Autodesk卸载工具(AdskUninstallHelper)进一步清理;3.谨慎操作注册表,删除与Revit相关的残留项;4.确保系统有至少30GB的可用磁盘空间;5.完成上述步骤后,重新尝试安装Revit。此外,文章还提到了一个免费功能商店,供用户寻找提效工具,并鼓励粉丝

ZOZO_888的博客 2129

Linux安装消息队列IBM MQ 7.5开发版安装配置详解

消息队列IBM MQ 7.5开发版安装配置详解 文章目录消息队列IBM MQ 7.5开发版安装配置详解前言一、什么是IBM MQ?二、安装前准备1、安装前准备2、安装MQ Server3、启动实例4、创建队列一个名为TEXT的队列(测试)5、启动端口监听6、启动成功总结 前言 IBM 已经熟练地优化了 MQ(消息队列),在市场上已有超过 25 年的历史。借助 MQ(消息队列),如果无法立即传递消息,那么会在其等待队列中确保消息安全,直到保证传递为止。竞争产品可能会传递两次消息或根本不传递消息,而 M

zhx__的博客 5165

C++调用动态库加载函数

文章目录使用dlopen通过动态库调用函数CMake构建环境下使用命令行工具验证上述流程使用bazel工具验证上述流程问题 使用dlopen通过动态库调用函数 CMake构建环境下 目录结构如下: . ├── CMakeLists.txt ├── include │ └── add.h ├── main.cc └── src ├── add.cc └── CMakeLists.txt 2 directories, 5 files ./CMakeLists.txt文件: cmake_

bleedingfight的博客 800

从OpenClaw到Hermes Agent:AI Agent实战部署与自动化工作流构建

AI Agent(智能体)作为大语言模型(LLM)的能力延伸,其核心原理在于通过工具调用(Tool Calling)与环境交互,使模型从“对话”走向“执行”。这一技术价值在于将自然语言指令转化为具体操作,实现业务流程自动化,从而提升开发与运维效率。在应用场景上,AI Agent广泛适用于自动化运维、智能客服、数据报告生成等重复性任务处理。本文聚焦于两大热门开源框架OpenClaw与Hermes Agent,深入探讨其部署配置、技能扩展及实战联调。通过结合OpenClaw的模块化扩展能力与Hermes Age

weixin_34122810的博客 503

c++使用dlopen

c++使用dlopen

weixin_43656490的博客 948

使用 MATLAB/Simulink 构建一个基于PID控制的直流电机速度调节系统模型

直流电机(DC Motor)因其结构简单、成本低廉、易于控制等特点,广泛应用于各种工业自动化和家用电器中。PID控制器作为最常用的控制策略之一,在直流电机的速度调节系统中具有重要应用价值。通过合理调整比例(P)、积分(I)、微分(D)三个参数,可以实现对电机速度的精确控制。本教程将带你使用构建一个基于PID控制的直流电机速度调节系统模型,涵盖电机模型构建、PID控制器设计、系统仿真与调试等多个方面。本文介绍了如何使用构建一个基于PID控制的直流电机速度调节系统模型。

amy_mhd的博客 217

实测可复现|2026 Cloudflare盾v4.0反反爬全实战:从JS/WASM逆向到JA3指纹伪装,手把手突破拦截(附完整逆向代码+避坑手册)

本文以2026年Cloudflare盾v4.0(集成Shield Synapse v2.0)为核心,全程以实战复盘为视角,拆解了从JS/WASM混合逆向、全维度指纹伪装(JA3+浏览器指纹)、人类行为模拟,到代理池搭建的全流程,整合了完整可复现的代码,所有步骤和踩坑点均为实测所得,无任何AI套话,新手也能跟着复现,最终实现爬取成功率从12%提升至95%+。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1686

windows C/C++移植linux(2) 加载动态共享库的不同

windows C/C++移植linux(2) -加载动态共享库的不同系统动态共享库简介静态库一个明显的缺点就是,当系统同时运行很多应用程序,并且应用程序都使用来自同一个函数库的函数,那么每一个应用程序都会存在这个函数的多个副本。对于频繁的调用的函数,将会消耗大量的内存和磁盘空间。动态共享库的出现解决了这个问题,当程序使用动态库的时候,连接方式是这样:程序本身不包括函数的代码,而是在引用运行时可访问

南有乔木NTU的博客 973

2024年11月架构设计师案例分析真题回顾,附参考答案、解析及所涉知识点(二)

软考高级系统架构设计师考试包含三个科目:信息系统综合知识、案例分析和系统架构设计论文。考试形式为机考。本文主要回顾2024年下半年(2024-11-10)系统架构设计师考试上午第二科案例分析的题目,同时附带参考解答、解析和所涉知识点。

一几文的编程学习笔记。 1660

C++11 教学示例:动态加载共享库(.so)

本文介绍了在Linux系统中使用C++动态加载共享库(.so)的方法。通过dlopen()、dlsym()等函数实现运行时加载,示例展示了如何创建共享库libuftmdb_dbclient_mysql.so和可执行文件utestsym。关键点包括:使用extern "C"避免函数名修饰,编译时添加-fPIC和-shared选项,运行时通过dlsym获取函数指针并调用。最终程序输出数据库连接和版本信息,验证了动态加载机制。这种方法适用于插件系统开发,具有模块化优势。

朝花夕拾 729

灵境视界:基于云计算与深度学习的智能手语识别AR眼镜

灵境视界”不仅仅是一款AR眼镜,它代表了未来无障碍沟通设备的发展方向。随着云计算与深度学习技术的不断进步,未来我们将进一步优化识别算法,提升翻译精度,并扩展更多语言和手语类型,为全球听障人士提供更加全面的沟通解决方案。是一款融合了云计算与深度学习技术的增强现实(AR)眼镜,专为听障人士和手语使用者设计。这款眼镜不仅具备先进的AR显示功能,还能实时识别并翻译手语,打破听障人士与健听人士之间的沟通障碍,推动无障碍社会的建设。,让沟通无界,视界无限。

qq_62634009的博客 725

Linux 下安装 openjdk 17【详细步骤】

JDK17,安装教程。

甘蓝的专栏 7503

Linux C++ libdl.so dlfcn.h使用方法(dlopen()、dlsym()、dlclose()、dlerror())(用于动态链接库操作)(懒加载、立即加载)共享库符号、动态库

RTLD_GLOBAL” 是 dlopen() 函数的一个标志,表示在打开共享库时将其中定义的符号全局可见,也就是说,共享库中的符号可以被后续打开的其他共享库所使用。是指在共享库中定义的可以被其他共享库和主程序使用的符号,这些符号在编译时会被加入到共享库的全局符号表中,并且可以通过 dlopen() 和 dlsym() 等函数在程序运行时动态加载和使用。是指在共享库中定义的只能被本地共享库中的其他符号所使用的符号,这些符号在编译时不会被加入到全局符号表中,只能在本地共享库内部进行使用。

Dontla的博客 4698

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

linux 动态库 导出类,linux C++ 共享库导出类

1.共享库的对外接口函数的声明必须加上extern “C”。2.使用共享库对话接口函数生成的对象指针时在该对象未被释放之前不能关闭共享库句柄,否则会出现segmentation fault错误。以下是一个插件式设计的示例:1、主执行程序:main.cpp#include#include#include "SMSGamePlugin.h"int main(int argc, char** argv)...

weixin_35925956的博客 942

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

C++ 中的共享库和静态库(Linux)

之前学习过VC环境下的动态库、静态库C++中的动态库和静态库 (Windows)http://zhweizhi.blog.51cto.com/10800691/1883814 而Linux环境下也有动态库、静态库,并且原理都是相似的一、共享库的创建、使用库:在C/C++中,使用库(Library)的技术,可以将编译好的符号提供给第三方使用。库有两种:1、共享库 Shared ...

weixin_33812433的博客 1243

linux g++ otl 编译库,Linux下用g++编译共享库的一个问题

最近在使用linux下的共享库so的时候遇到一个奇怪的问题,做个记录,方便备查。一般来说,如果用gcc编译的时候加上-shared和-fPIC选项,可以把源文件编译成一个so文件,可以在其他源程序连接阶段把这个链接上去,从而可以调用so文件提供的函数接口,这样可以多文件共用一个so文件提供的函数,即节省内存空间,也便于更新,所有的接口只需要更新so文件就行。其实除了上面的方法,还有一个方法,那就是...

weixin_42347629的博客 179

C/C++程序在不同环境中迁移时的注意事项

C/C++程序在编译、链接、运行时的常见问题

升级打怪记录 1085

linux下 java JNI调用C语言动态链接库

JNI是Java native interface的简写,可以译作Java原生接口。Java可以通过JNI调用C/C++的库,这对于那些对性能要求比较高的Java程序无疑是一个 福音。 使用JNI也是有代价。大家都知道JAVA程序是运行在JVM之上的,可以做到平台无关。但是如果Java程序通过JNI调用了原生的代码(比如 c/c++等),则Java程序就丧失了平台无关性。最起码需要...

web开发自学 119

linux下c代码调用.so,Linux下C程序调用.so(动态链)的一个例子

/*********************************************** 使用Linux下C++的动态链接库.So文件* void *pdlHandle;* pdlHandle = dlopen("/home/fengsy/len/Len.So/len.so", RTLD_LAZY);* pnswap=dlsym(pdlHandle, "swap");***********...

weixin_29502425的博客 307

linux 显式链接so库

linux加载程序变成进程的过程 fork进程, 在内核创建进程相关内核项, 加载进程可执行文件 查找依赖的so库, 加载映射虚拟地址 初始化程序变量 动态库依赖越多, 进程启动就越慢, 并且发布程序的时候, 这些链接但没有使用的so同样要一起跟着发布, 否则进程启动时候找不到对应的so导致启动失败. 一些查看依赖的命令 查看依赖关系: readelf -d xx.so 查看链...

北京-大白的博客 2560

使用 `dlopen` 动态加载 `.so` 文件

本文介绍了使用dlopenAPI动态加载.so共享库的方法。主要内容包括:1)基本使用流程:加载库、获取函数指针、调用函数和关闭库;2)完整示例演示如何创建包含数学函数的共享库并动态加载;3)重要注意事项如符号可见性、错误处理和内存管理;4)CMake项目集成方法;5)高级用法如加载类和实现插件系统。dlopen提供了运行时加载共享库的灵活性,适用于需要动态扩展功能的场景,但需要开发者自行管理更多细节。文章通过代码示例详细说明了各步骤的实现方式。

啊渊的专栏 408
上一篇: Eclipse CDT 难以忍受的慢
下一篇: [RHEL 4U4] 最小安装后安装Apache(RPM)
FlySpace
博客等级 码龄27年 17粉丝 121原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值