C语言加载动态库

头文件:#include<dlfcn.h>

void * dlopen(const char* pathName, int mode); 返回值 handle

void *dlsym(void *handle, const char* symbol); 返回值 函数起始地址

handle是使用dlopen函数之后返回的句柄,symbol是要求获取的函数的名称,函数,返回值是void*,指向函数的地址;

测试:

创建一个.c文件,编译成动态链接库

  1. /*************************************************************************
  2. > File Name: hello.c
  3. > Author:
  4. > Mail:
  5. > Created Time: 2019年12月12日 星期四 14时39分42秒
  6. ************************************************************************/
  7.  
  8. #include<stdio.h>
  9.  
  10. int hello() {
  11. printf("hello c \n");
  12. return ;
  13. }
  1. gcc -shared -fPIC hello.c -o hello.so

创建一个头文件申明hello函数

  1. /*************************************************************************
  2. > File Name: hello.h
  3. > Author:
  4. > Mail:
  5. > Created Time: 2019年12月12日 星期四 14时40分25秒
  6. ************************************************************************/
  7.  
  8. #ifndef _HELLO_H
  9. #define _HELLO_H
  10.  
  11. int hello();
  12.  
  13. #endif

创建一个main.c用于测试编译的hello.so是否正确

  1. /*************************************************************************
  2. > File Name: mian.c
  3. > Author:
  4. > Mail:
  5. > Created Time: 2019年12月12日 星期四 14时41分22秒
  6. ************************************************************************/
  7.  
  8. #include<stdio.h>
  9. #include"hello.h"
  10.  
  11. int main() {
  12. hello();
  13. return ;
  14. }

使用动态链接库编译

  1. gcc main.c -o app ./hello.so

运行编译好的app文件输出如下

  1. hello c

证明动态链接库编译成功,接下来使用dlopen和dlsym调用hello.so内的hello函数

  1. /*************************************************************************
  2. > File Name: mian.c
  3. > Author:
  4. > Mail:
  5. > Created Time: 2019年12月12日 星期四 14时41分22秒
  6. ************************************************************************/
  7.  
  8. #include<stdio.h>
  9. #include<dlfcn.h>
  10. #include"hello.h"
  11.  
  12. typedef int (*callback)();
  13. static callback cb;
  14.  
  15. int main() {
  16. void* handle;
  17. handle = dlopen("./hello.so",RTLD_LAZY);
  18. if (!handle) {
  19. printf("handle is null \n");
  20. return ;
  21. }
  22. cb = (callback)dlsym(handle, "hello");
  23. cb();
  24. return ;
  25. }

编译main.c 需要链接静态库

  1. gcc main.c -o app -ldl

运行程序

  1. hello c

可以发现与之前使用动态链接库编译运行结果相同。

C语言 dlopen dlsym的更多相关文章

  1. dlopen, dlsym今天才刚知道干什么用的,羞死人了

    dlopen, dlsym今天才刚知道干什么用的,羞死人了

  2. LINUX下动态链接库的使用-dlopen dlsym dlclose dlerror(转)

    dlopen 基本定义 功能:打开一个动态链接库  包含头文件:  #include <dlfcn.h>  函数定义:  void * dlopen( const char * pathn ...

  3. LINUX下动态链接库的使用-dlopen dlsym dlclose dlerror

    本定义 功能:打开一个动态链接库 包含头文件: #include <dlfcn.h> 函数定义: void * dlopen( const char * pathname, int mod ...

  4. 加载动态链接库——dlopen dlsym dlclose

    DLOPEN DLMOPEN DLCLOSE NAME     dlclose, dlopen, dlmopen - 打开/关闭共享对象 SYNOPSIS #include <dlfcn.h&g ...

  5. C - dlopen dlsym

    -----------------------------------------------------------------------------dlsym------------------ ...

  6. C语言动态调用库(转)

    转自:http://cloverprince.iteye.com/blog/481309 现有一个主程序用C语言写成.现在要允许第三方开发人员编写扩展的模块,约定第三方开发的模块必须提供一系列已知名称 ...

  7. C 语言 和 python 调用 .so 文件

    什么是静态库和动态库, 看一篇博客 http://www.cnblogs.com/skynet/p/3372855.html 现在,我们首先生成.so文件 首先, 我们写一个a.c文件 1 2 3 4 ...

  8. 执行dlsym()函数出现: undefined symbol

    执行dlsym()函数出现: undefined symbol 执行dlsym()函数出现: undefined symbol 当这个问题出现的时候,可以检查产生so文件的cpp文件,看看是否已经用  ...

  9. 精通UNIX下C语言编程与项目实践

    cc  -I  //include 目录 -L //静态库目录?动态也可以 -l //小写L,接静态库名称?动态也可以 -DXXX='"XXFF"' //-D直接定义宏 -c 只编 ...

随机推荐

  1. Centos开发小计

    1. 生成静态库,linux下库的规则是lib开头 g++ -c code.cpp ar cr libcode.a code.o

  2. JAVA锁的膨胀过程和优化(阿里)

    阿里的人问什么是锁膨胀,答不上来,回来做了总结: 关于锁的膨胀,synchronized的原理参考:深入分析Synchronized原理(阿里面试题) 首先说一下锁的优化策略. 1,自旋锁 自旋锁其实 ...

  3. Python3.7 - Argparse模块的用法

    argparse 是一个命令行参数解析模块. argparse 是python自带的命令行参数解析包,可以用来方便地读取命令行参数,当你的代码需要频繁地修改参数的时候,使用这个工具可以将参数和代码分离 ...

  4. 快速排序详解(C语言/python)

    快速排序详解 介绍: 快速排序于C. A. R. Hoare在1960年提出,是针对冒泡排序的一种改进.它每一次将需要排序的部分划分为俩个独立的部分,其中一个部分的数比的数都小.然后再按照这个方法对这 ...

  5. 腾讯云IPv6技术拿了个一等奖!1.5亿人已经用上

    中国通信学会在其官网上公布了2019年中国通信学会科学技术奖的评选结果,腾讯云和中国移动通信集团,中国信息通信研究院.以及华为联合申报的“移动互联网IPv6技术攻关及规模应用”项目荣获今年科学技术一等 ...

  6. [转帖]Druid介绍及入门

    Druid介绍及入门 2018-09-19 19:38:36 拿着核武器的程序员 阅读数 22552更多 分类专栏: Druid   版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议 ...

  7. NPOI导出 The maximum column width for an individual cell is 255 characters

    增加如下代码 ) { arrColWidth[column.Ordinal] = ; } //设置列宽 sheet.SetColumnWidth(column.Ordinal, (arrColWidt ...

  8. java 简单工具

    1.String操作 /** * 根据正则字符串过滤不需要的字符串 * @param arr * @param regex * @return */ public static String[] fi ...

  9. log4net自动删除日志文件

    晚上关于删除的日志文件主要有 https://blog.csdn.net/hellolib/article/details/78316253, 其实我这里的实现方式和他差不多,不过我这里不用配置时间, ...

  10. Mysql系列(四) —— MySQL的Charset和Collation

    本文转载自:再见乱码:5分钟读懂MySQL字符集设置 一.内容概述 在MySQL的使用过程中,了解字符集.字符序的概念,以及不同设置对数据存储.比较的影响非常重要.不少同学在日常工作中遇到的" ...