C语言 dlopen dlsym
C语言加载动态库
头文件:#include<dlfcn.h>
void * dlopen(const char* pathName, int mode); 返回值 handle
void *dlsym(void *handle, const char* symbol); 返回值 函数起始地址
handle是使用dlopen函数之后返回的句柄,symbol是要求获取的函数的名称,函数,返回值是void*,指向函数的地址;
测试:
创建一个.c文件,编译成动态链接库
- /*************************************************************************
- > File Name: hello.c
- > Author:
- > Mail:
- > Created Time: 2019年12月12日 星期四 14时39分42秒
- ************************************************************************/
- #include<stdio.h>
- int hello() {
- printf("hello c \n");
- return ;
- }
- gcc -shared -fPIC hello.c -o hello.so
创建一个头文件申明hello函数
- /*************************************************************************
- > File Name: hello.h
- > Author:
- > Mail:
- > Created Time: 2019年12月12日 星期四 14时40分25秒
- ************************************************************************/
- #ifndef _HELLO_H
- #define _HELLO_H
- int hello();
- #endif
创建一个main.c用于测试编译的hello.so是否正确
- /*************************************************************************
- > File Name: mian.c
- > Author:
- > Mail:
- > Created Time: 2019年12月12日 星期四 14时41分22秒
- ************************************************************************/
- #include<stdio.h>
- #include"hello.h"
- int main() {
- hello();
- return ;
- }
使用动态链接库编译
- gcc main.c -o app ./hello.so
运行编译好的app文件输出如下
- hello c
证明动态链接库编译成功,接下来使用dlopen和dlsym调用hello.so内的hello函数
- /*************************************************************************
- > File Name: mian.c
- > Author:
- > Mail:
- > Created Time: 2019年12月12日 星期四 14时41分22秒
- ************************************************************************/
- #include<stdio.h>
- #include<dlfcn.h>
- #include"hello.h"
- typedef int (*callback)();
- static callback cb;
- int main() {
- void* handle;
- handle = dlopen("./hello.so",RTLD_LAZY);
- if (!handle) {
- printf("handle is null \n");
- return ;
- }
- cb = (callback)dlsym(handle, "hello");
- cb();
- return ;
- }
编译main.c 需要链接静态库
- gcc main.c -o app -ldl
运行程序
- hello c
可以发现与之前使用动态链接库编译运行结果相同。
C语言 dlopen dlsym的更多相关文章
- dlopen, dlsym今天才刚知道干什么用的,羞死人了
dlopen, dlsym今天才刚知道干什么用的,羞死人了
- LINUX下动态链接库的使用-dlopen dlsym dlclose dlerror(转)
dlopen 基本定义 功能:打开一个动态链接库 包含头文件: #include <dlfcn.h> 函数定义: void * dlopen( const char * pathn ...
- LINUX下动态链接库的使用-dlopen dlsym dlclose dlerror
本定义 功能:打开一个动态链接库 包含头文件: #include <dlfcn.h> 函数定义: void * dlopen( const char * pathname, int mod ...
- 加载动态链接库——dlopen dlsym dlclose
DLOPEN DLMOPEN DLCLOSE NAME dlclose, dlopen, dlmopen - 打开/关闭共享对象 SYNOPSIS #include <dlfcn.h&g ...
- C - dlopen dlsym
-----------------------------------------------------------------------------dlsym------------------ ...
- C语言动态调用库(转)
转自:http://cloverprince.iteye.com/blog/481309 现有一个主程序用C语言写成.现在要允许第三方开发人员编写扩展的模块,约定第三方开发的模块必须提供一系列已知名称 ...
- C 语言 和 python 调用 .so 文件
什么是静态库和动态库, 看一篇博客 http://www.cnblogs.com/skynet/p/3372855.html 现在,我们首先生成.so文件 首先, 我们写一个a.c文件 1 2 3 4 ...
- 执行dlsym()函数出现: undefined symbol
执行dlsym()函数出现: undefined symbol 执行dlsym()函数出现: undefined symbol 当这个问题出现的时候,可以检查产生so文件的cpp文件,看看是否已经用 ...
- 精通UNIX下C语言编程与项目实践
cc -I //include 目录 -L //静态库目录?动态也可以 -l //小写L,接静态库名称?动态也可以 -DXXX='"XXFF"' //-D直接定义宏 -c 只编 ...
随机推荐
- Centos开发小计
1. 生成静态库,linux下库的规则是lib开头 g++ -c code.cpp ar cr libcode.a code.o
- JAVA锁的膨胀过程和优化(阿里)
阿里的人问什么是锁膨胀,答不上来,回来做了总结: 关于锁的膨胀,synchronized的原理参考:深入分析Synchronized原理(阿里面试题) 首先说一下锁的优化策略. 1,自旋锁 自旋锁其实 ...
- Python3.7 - Argparse模块的用法
argparse 是一个命令行参数解析模块. argparse 是python自带的命令行参数解析包,可以用来方便地读取命令行参数,当你的代码需要频繁地修改参数的时候,使用这个工具可以将参数和代码分离 ...
- 快速排序详解(C语言/python)
快速排序详解 介绍: 快速排序于C. A. R. Hoare在1960年提出,是针对冒泡排序的一种改进.它每一次将需要排序的部分划分为俩个独立的部分,其中一个部分的数比的数都小.然后再按照这个方法对这 ...
- 腾讯云IPv6技术拿了个一等奖!1.5亿人已经用上
中国通信学会在其官网上公布了2019年中国通信学会科学技术奖的评选结果,腾讯云和中国移动通信集团,中国信息通信研究院.以及华为联合申报的“移动互联网IPv6技术攻关及规模应用”项目荣获今年科学技术一等 ...
- [转帖]Druid介绍及入门
Druid介绍及入门 2018-09-19 19:38:36 拿着核武器的程序员 阅读数 22552更多 分类专栏: Druid 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议 ...
- NPOI导出 The maximum column width for an individual cell is 255 characters
增加如下代码 ) { arrColWidth[column.Ordinal] = ; } //设置列宽 sheet.SetColumnWidth(column.Ordinal, (arrColWidt ...
- java 简单工具
1.String操作 /** * 根据正则字符串过滤不需要的字符串 * @param arr * @param regex * @return */ public static String[] fi ...
- log4net自动删除日志文件
晚上关于删除的日志文件主要有 https://blog.csdn.net/hellolib/article/details/78316253, 其实我这里的实现方式和他差不多,不过我这里不用配置时间, ...
- Mysql系列(四) —— MySQL的Charset和Collation
本文转载自:再见乱码:5分钟读懂MySQL字符集设置 一.内容概述 在MySQL的使用过程中,了解字符集.字符序的概念,以及不同设置对数据存储.比较的影响非常重要.不少同学在日常工作中遇到的" ...