【众途 源码】【setfilter源码】【yfiles 源码】dlopen源码

时间:2024-11-23 13:28:26 来源:海南到云南源码 分类:知识

1.深入分析linux下 动态库的源码显性调用(dlopen)和隐性调用区别
2.android dlopen原型在哪个so
3.一种简单加载vulkan动态库的方法

dlopen源码

深入分析linux下 动态库的显性调用(dlopen)和隐性调用区别

       在Linux环境下编程时,使用第三方库有多种方式。源码主要可以分为四类:合并源码、源码使用静态库、源码隐性调用动态库和显性调用动态库。源码

       合并源码和使用静态库的源码众途 源码实质相同,静态库在编译时被合并到项目中,源码当无法获取第三方库源码时,源码静态库提供了一个黑盒解决方案。源码而隐性调用动态库和显性调用动态库则属于动态库使用范畴,源码其中隐性调用动态库在程序执行前检查并加载动态库,源码显性调用动态库在程序执行过程中仅在使用到相关函数时才加载动态库。源码

       隐性调用动态库需要将动态库文件拷贝至特定目录,源码无论程序是源码否真正使用该动态库,检查和加载动态库在执行前已完成,源码而动态库会一直驻留在内存中。显性调用动态库则无需在程序执行前加载动态库文件,仅在程序调用相关函数时动态加载,提供了一种灵活的setfilter源码插件式加载机制。

       为直观对比这四种方式的内存占用情况,可以设计一个简单的测试场景。实现一个包含加、减、乘、除、打印等功能的计算库,主程序调用此库。通过监控内存使用情况,yfiles 源码可以观察到显性调用动态库时,dlopen前动态库文件并未读入内存,只有在执行dlopen后,动态库文件才被加载到内存中。

       在进行测试时,分别采取源码、静态库、隐性动态调用和显性动态调用的方式,对比内存使用情况。somv源码在源码方式下,内存占用约为kb;静态库调用内存占用与源码方式相同;隐性动态调用内存变化不大,但内存中已包含libcalculate.so;而显性动态调用内存增加到kb,表明动态库仅在实际使用时才被加载。

       总结而言,显性调用动态库更适合于需要按需加载功能的大型项目,提供了一种内存和磁盘占用更为灵活的解决方案,但使用上相对复杂,需要额外的setWifiEnable源码代码转换。相比之下,隐性调用动态库在内存使用上更为简洁,但可能会导致动态库的无谓加载。在实际生产环境中,若对内存、磁盘空间和启动速度没有特别要求,推荐使用隐性调用动态库,以简化程序编写和维护。

android dlopen原型在哪个so

       1、 .so态库

       ä½¿ç”¨gcc或者g++编译器态库文件(处g++编译器例)

       g++ -shared -fPIC -c XXX.cpp

       g++ -shared -fPIC -o XXX.so XXX.o

       2、 .so态库态调用接口函数说明

       æ€åº“调用关系需要调用态库程序编译通g++-L-l命令指定例:程序test启需要加载目录/root/src/liblibtest_so1.so态库编译命令照编写执行:

       g++ -g -o test test.cpp –L/root/src/lib –ltest_so1

       ï¼ˆå¤„我重点讲解态库态调用关于静态通g++编译命令调用式作详细讲解具体相关内容网查询)

       Linux提供专门组API用于完打态库查找符号处理错关闭态库等功能

       é¢äº›æŽ¥å£å‡½æ•°é€ä»‹ç»ï¼ˆè°ƒç”¨äº›æŽ¥å£éœ€å¼•ç”¨æ–‡ä»¶#include ):

       1) dlopen

       å‡½æ•°åŽŸåž‹ï¼švoid *dlopen(const char *libname,int flag);

       åŠŸèƒ½æè¿°ï¼šdlopen必须dlerrordlsymdlclose前调用表示要库装载内存准备使用要装载库依赖于其库必须首先装载依赖库dlopen操作失败返NULL值;库已经装载则dlopen返同句柄

       å‚æ•°libname般库全路径dlopen直接装载该文件;指定库名称dlopen按照面机制搜寻:

       a.根据环境变量LD_LIBRARY_PATH查找

       b.根据/etc/ld.so.cache查找

       c.查找依/lib/usr/lib目录查找

       flag参数表示处理未定义函数式使用RTLD_LAZY或RTLD_NOWRTLD_LAZY表示暂处理未定义函数先库装载内存等用没定义函数再说;RTLD_NOW表示马检查否存未定义函数若存则dlopen失败告终

       2) dlerror

       å‡½æ•°åŽŸåž‹ï¼šchar *dlerror(void);

       åŠŸèƒ½æè¿°ï¼šdlerror获近dlopen,dlsym或dlclose操作错误信息返NULL表示错误dlerror返错误信息同清除错误信息

       3) dlsym

       å‡½æ•°åŽŸåž‹ï¼švoid *dlsym(void *handle,const char *symbol);

       åŠŸèƒ½æè¿°ï¼šdlopen库装载内存dlsym获指定函数(symbol)内存位置(指针)找指定函数则dlsym返NULL值判断函数否存使用dlerror函数

       4) dlclose

       å‡½æ•°åŽŸåž‹ï¼šint dlclose(void *);

       åŠŸèƒ½æè¿°ï¼šå·²ç»è£…载库句柄减句柄减至零则该库卸载存析构函数则dlclose析构函数调用

       3、 普通函数调用

       å¤„源码实例说明各源码文件关系:

       test_so1.htest_so1.cpptest_so1.so态库

       test_so2.htest_so2.cpptest_so2.so态库

       test_dl.cpptest_dl执行程序test_dl通dlopen系列等API函数并使用函数指针达态调用同so库test函数目

       -

一种简单加载vulkan动态库的方法

       在适配国产Linux环境的vulkan应用时,常需面对系统自带libvulkan.so.1但缺失libvulkan.so的困境。若系统源缺少vulkan SDK或loader,需手工下载并编译,步骤繁琐且涉及依赖安装与CMake升级。为简化流程,实现快速测试vulkan兼容性和调试应用,本文提出一种简易加载vulkan动态库的方法,无需安装vulkan SDK或loader,直接利用系统中自带的libvulkan.so.1。

       基本原理在于初始化阶段,通过dlopen和dlsym加载vulkan动态库中的api函数指针,应用程序直接调用这些api。本文采用了一个开源的动态库加载工具dylib,支持多系统平台。以vkCreateInstance函数地址的加载为例,需注意vkCreateInstance在vulkan_core.h中的声明被宏VK_NO_PROTOTYPES括起。在CMake中添加该宏定义(add_definitions(-DVK_NO_PROTOTYPES)),阻止vulkan_core.h对原生vk api进行声明。这样,可在load.h中对原生vulkan api进行声明,实现动态库加载。

       整个load.h源码示例如下,应用于app初始化时调用vk_loader_init(),实现vulkan动态库中所有函数地址的加载。测试demo项目的地址提供于此。