dlopen的使用

dlopen的使用在 dlopen 的函数以指定模式打开指定的动态连接库文件 并返回一个句柄给调用进程 使用 dlclose 来卸载打开的库 1 函数出处 include dlfcn h void dlopen constchar pathname intmode 2 参数介绍 mode 是打开方式 其值有多个 不同操作系统上实现的功能有所不同 在 dlfcn h

在dlopen的函数以指定模式打开指定的动态连接库文件,并返回一个句柄给调用进程。使用dlclose()来卸载打开的库。

1、函数出处 

 

#include 
  
    void * dlopen( const char * pathname, int mode ); 
  

 

2、参数介绍

 

mode是打开方式,其值有多个,不同操作系统上实现的功能有所不同,在linux下,按功能可分为三类:       

        1、解析方式

        3、作用方式

3、返回值

        打开错误返回NULL

                成功,返回库引用

4、实例

/*测试函数main.c(编译时候要加入-ldl(指定dl库))*/ #include 
  
    #include 
   
     #define NONE "\033[m" #define RED "\033[0;32;31m" extern int g_count; int main(int argc, char argv) { void* pdlhandle; char* pszerror; int (*mytest)(int num); pdlhandle = dlopen("./libtest.so", RTLD_LAZY); pszerror = dlerror(); if (0 != pszerror) { printf("%s", pszerror); return 1; } mytest = dlsym(pdlhandle, "test"); pszerror = dlerror(); if (0 != pszerror) { printf("%s", pszerror); return 1; } mytest(3); //defined in test.c (libtest.c) printf(RED"[%s %s]"NONE": g_count=%d\n",__FILE__, __FUNCTION__, g_count); //[%s %s]以赤色 打印 dlclose(pdlhandle); return 0; } 
    
  

 

 

#include "add.h" int g_count; int add(int num) { g_count +=num; printf("[%s %s]: g_count=%d\n",__FILE__, __FUNCTION__, g_count); return 0; }

 

 

#include "stdio.h" #include "stdlib.h" #include "unistd.h" extern int g_count; int add(int num);

生成libtest.so动态库文件test.c

 

 

#include "add.h" #define NONE "\033[m" #define BLUE "\033[0;32;34m" int test(int num) { add(num); //defined in add.c (libadd.so) printf(BLUE"[%s %s]"NONE": g_count=%d\n",__FILE__, __FUNCTION__, g_count); //[%s %s]以蓝色打印 return 0; }

 

 

CROSS= #CROSS=/gcc-4.2/arm-linux- CC = $(CROSS)gcc LDFLAGS = -L. -Wl,-rpath,./ LIBS = -ltest -ladd -ldl OBJS = main.o DYNLIB = libadd.so libtest.so TARGET = test ALL: $(DYNLIB) $(TARGET) $(TARGET): $(OBJS) $(CC) $(LDFLAGS) $(LIBS) $(OBJS) -o $(TARGET) $(OBJS): main.c $(CC) -c $^ $< $(DYNLIB): $(CC) -fPIC -shared add.c -o libadd.so $(CC) -fPIC -shared test.c -o libtest.so clean: rm -f *.o rm -f *.so rm -f $(TARGET)

 

注意:Makefile中 -Wl,-rpath,./将加载动态库的路径写到代码里,这就不必要应用export LD_LIBRARY_PATH=./来指定查找共享库的路径。
libtest.so 凭借libadd.so, 这时在main()中调用dlopen()来加载libtest.so时,碰到不能理会的标记(g_count)时,他会加载libadd.so. 并不是本身之前灵活地认为 ,dlopen()只会加载libtest.so, 而不去理会libadd.so中的标记.

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/229008.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午5:41
下一篇 2026年3月16日 下午5:41


相关推荐

  • python协程系列_Python进阶

    python协程系列_Python进阶协程协程(Coroutine),又称微线程,纤程。(协程是一种用户态的轻量级线程)作用:在执行A函数的时候,可以随时中断,去执行B函数,然后中断B函数,继续执行A函数(可以自动切换)

    2022年8月7日
    6
  • decode encode区别_python decode和encode

    decode encode区别_python decode和encode#-*-coding:utf-8importsys”’*首先要搞清楚,字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。decode的作用是将其他编码的字符串转换成unicode编码,如str1.decode(‘gb231…

    2022年10月7日
    9
  • DALL-E3怎么用?图文教程详解

    DALL-E3怎么用?图文教程详解

    2026年3月14日
    3
  • 重磅!大模型 AI Agents 优化最新综述

    重磅!大模型 AI Agents 优化最新综述

    2026年3月16日
    3
  • 国内团队博客汇总_中国最成功的团队

    国内团队博客汇总_中国最成功的团队京东前端团队凹凸实验室蘑菇街技术博客奇迹空间科技有限公司百度技术沙龙百度web前端团队FEX饿了么物流悦跑圈技术团队并发编程网阿里中间件团队博客阿里技术沙龙天猫无线团队淘宝前端团队FED美团点评技术团队奇虎360技术博客alloyteam腾讯全端腾讯Bugly腾讯wetestIBMdeveloperWorks中国Glow

    2022年8月13日
    4
  • 星愿浏览器有什么优点_星愿浏览器插件

    星愿浏览器有什么优点_星愿浏览器插件目的:想基于浏览器进程抓包,但是想获得噪声相对小的数据,则找相对ChromeGoogle等主流browser更简单的浏览器;想使用Google的某个扩展程序,所以找基于Chrome内核的浏览器所以,我要找基于Chrome内核的简单浏览器最后找到了这几个符合条件的浏览器:星愿、百分cent、Vival、Brave星愿优点:星愿的主页面具有相当的自主性,可以自由拖动添加图标和更换背景、搜索框等。其主页有个搜索漫画的功能,好像在看漫画这一块做了一些页面优化。缺点:只能在它提供的星愿商店里下扩.

    2025年6月11日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号