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的更多相关文章

  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. 食物链【NOI2001】(信息学奥赛一本通 1390)

    [题目描述] 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种 ...

  2. python总结四

    sql性能优化的几种方式: 1.查询的模糊匹配: 尽量避免在一个复杂查询里面使用like '%parm%',前面的%会导致相关列的索引无法使用,最好不要用 直接修改后台,根据输入条件,先查出符合条件的 ...

  3. git filter-branch之后撤销到原来状态

    起因 因为要拆分仓库,所以按照原来的操作拆分,拆分完成后发现有问题,所以准备还原重新拆分. 注意 git filter-branch之后,不可以做其他额外操作 运行git filter-branch之 ...

  4. 【Gamma】Scrum Meeting 10

    目录 写在前面 任务进度表 燃尽图 照片 写在前面 例会时间:6.8 22:30-23.00 例会地点:微信群语音通话 代码进度记录github在这里 任务进度表 注:点击链接跳转至相应的issue ...

  5. Git/SVN提交代码规范

    feat - 新功能 feature fix - 修复 bug docs - 文档注释 style - 代码格式(不影响代码运行的变动) refactor - 重构.优化(既不增加新功能,也不是修复b ...

  6. Maven -------------- Eclipse 安装maven ,配置setting文件

    1.设置maven路径 Window->Preferences->Maven->Installations-> 选择maven的路径,如果原来有低版本的建议删除 选择好后点击f ...

  7. MySql Packet for query is too large问题解决方案

    MySQL会限制Server接受的数据包大小.有时候插入.更新或查询时数据包的大小,会受 max_allowed_packet 参数限制,导致操作失败.报错信息为: Caused by: com.my ...

  8. 发现一个企业微信第三方应用开发的疑似BUG

    1.企业微信两个账号A(超级管理员),账号B(分级管理员),账号B具有创建应用与小程序权限.2.账号B添加一个第三方应用后(创建后能看到第三方应用),使用下图接口登录时回调的agent一直为空,3.超 ...

  9. 桥接(Bridge)模式

    桥接模式又称为柄体模式或接口模式.桥接模式的用意就是"将抽象化与实现化解耦,使得二者可以独立变化". 抽象化: 存在于多个实体中的共同的概念性联系,就是抽象化.作为一个过程,抽象化 ...

  10. ZYNQ笔记(4):PL触发中断

    一.ZYNQ中断框图 PL到PS部分的中断经过ICD控制器分发器后同时进入CPU1 和CPU0.从下面的表格中可以看到中断向量的具体值.PL到PS部分一共有20个中断可以使用.其中4个是快速中断.剩余 ...