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. Polling 、Long Polling 和 WebSocket

    最近在学习研究WebSocket,了解到Polling 和Long Polling,翻阅了一些博文,根据自己的理解,做个学习笔记 Polling (轮询): 这种方式就是客户端定时向服务器发送http ...

  2. 用luks方式对磁盘进行加密以及加密磁盘的自动挂载

    1.关于luks加密 LUKS(Linux Unified Key Setup)为Linux硬盘分区加密提供了一种标准,它不仅能通用于不同的 Linux发行版本,还支持多用户/口令.因为它的加密密钥独 ...

  3. [Gamma]Scrum Meeting#7

    github 本次会议项目由PM召开,时间为6月2日晚上10点30分 时长10分钟 任务表格 人员 昨日工作 下一步工作 木鬼 撰写博客,组织例会 撰写博客,组织例会 swoip 大作业截止,请假 前 ...

  4. Java编程思想之十一 持有对象

    如果一个程序只包含固定数量的且其生命期都是已知的对象,那么这是一个非常简单的程序. 11.1 泛型和类型安全的容器 使用ArrayList:创建一个实例,用add()插入对象,然后用get()访问对象 ...

  5. 重置jenkins用户名密码

    忘记用户名密码(如图)不管是忘记用户名密码还是误删jenkins目录下的users文件都可以使用下面的方式找回密码,我的版本是Jenkins 2.134 1.     进入jenkins安装目录,我的 ...

  6. Docker方式安装SonarQube

    获取镜像 docker pull postgres: docker pull sonarqube:-community 启动镜像 docker run -d -p : -e POSTGRES_PASS ...

  7. ef core 全局过滤

    有些固定的条件,基本每个查询的时候需要带的条件,我们可以使用全局过滤来帮我们,这样后面的查询就不用每次都带条件了. 微软自带的:https://docs.microsoft.com/zh-cn/ef/ ...

  8. Jumpserver 5.2版本安装与部署

    组件说明 Jumpserver 为管理后台, 管理员可以通过 Web 页面进行资产管理.用户管理.资产授权等操作, 用户可以通过 Web 页面进行资产登录, 文件管理等操作 koko 为 SSH Se ...

  9. [记录]安装.Net Framework 4.6.2时出现“无法建立到信任根颁发机构的证书链”解决方法

    在安装Microsoft .NET Framework 4.6.2脱机包时提示 无法建立到信任根颁发机构的证书链 实际上是要安装一个根证书.解决方案如下(因无法贴链接,可百度搜索“mamicode.c ...

  10. 【转】用 async/await 来处理异步

    原文地址:https://www.cnblogs.com/SamWeb/p/8417940.html 昨天看了一篇vue的教程,作者用async/ await来发送异步请求,从服务端获取数据,代码很简 ...