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. TCP四次挥手客户端关闭链接为什么要等待2倍MSL

    最长报文寿命 在TCP协议中,当发送方发送释放连接报文收到确认报文后,只是在一个方向上断开了TCP连接,然后,接收方发送释放连接的报文,发送方回复确认.此时,连接还没有释放,发送方要等待2MSL(ma ...

  2. Log4j之HelloWorld

    在编写项目的时候,我们一般都会用到日志记录,方便出错查找原因.首先我们需要了解什么是Log4j 1.使用maven建立工程,在pom.xml中加入如下: <dependency> < ...

  3. 微信公众平台开发(150)——从新浪云SAE上传图片到图文消息

    从新浪云SAE上传图片到图文消息,只能用于图文消息中, 没有个数限制 if (!empty($_FILES['qrcode']['name'])){ $filename = time()." ...

  4. 《Modern PHP》读书笔记

    这本书适合你吗?     我认为每个有一定PHP开发经验的人都应该读读这本书,因为正如书中的前言所说: “网上有成千上万的PHP教程,其中大多数都已经过时了,展示的是陈旧的实践方式.可是,谷歌的搜索结 ...

  5. linux的arp表满导致同网段无法ping通

    由于历史原因,有一个网段子网设置非常大10.0.0.0/21,8个C地址段为一个子网. linux内核默认arp表大小为1024,导致一台监控机器arp表溢出,同时导致日志输出速率超出限制,无法输出日 ...

  6. Selenium基础教程(三)自动化插件Katalon

    Katalon-一款好用的selenium自动化测试插件 Selenium 框架是目前使用较广泛的开源自动化框架,一款好的.基于界面的录制工具对于初学者来说可以快速入门:对于老手来说可以提高开发自动化 ...

  7. flowable ui 界面请假流程操作实例

    如题,网上的教程多是代码居多,UI界面操作实例那更是一页难求,楼主分享下几天来的入坑经历,希望有需要了解,但是不知道去哪里了解的小伙伴,看完我的文章后能有所启发,文章有不足之处还请指正,若有相关问题请 ...

  8. 如何删除docker镜像中已配置的volume

    场景: 有个同学不知道因为啥,将容器内部的 /sys/fs/cgroup 挂载到了外面的某个目录: 但是这个目录是很有用的,不想随便被挂载,如何从image中去掉呢? docker没有给出一个方便的方 ...

  9. Java分布式唯一ID生成方案——比UUID效率更高的生成id工具类

    package com.xinyartech.erp.core.util; import java.lang.management.ManagementFactory; import java.net ...

  10. powershell程序

    powershell是一个命令行解释器.它输出一个字符,等待命令行的输入,然后执行这个命令.下面是powershell非常重要的命令: