博客搬家,原地址:https://langzi989.github.io/2017/10/16/Unix中dl库学习/

在linux中静态链接库和动态链接库是进程之间代码共享的两种方式。Linux在<dlfnc.h>库中提供了加载和处理动态连接库的系统调用,使用非常方便。具体用法如下:

dlfcn库中函数说明

dlfcn库中主要包括四个函数:

#include <dlfcn.h>void* dlopen(const char*, int flag);char* dlerror();void* dlsym(void* handler, char* symbol);int dlclose(void* handler);
  • dlopen : 打开一个动态连接库,并返回一个类型为void*的handler,flag为打开模式,可选的模式有两种

    • RTLD_LAZY 暂缓决定,等有需要时再解出符号
    • RTLD_NOW 立即决定,返回前解除所有未决定的符号。
  • dlerror : 返回dl操作的错误,若没有出现错误,则返回NUlL,否则打印错误信息
  • dlsym : 查找动态链接库中的符号symbol,并返回该符号所在的地址
  • dlclose : 关闭动态链接库句柄

使用实例

动态链接库cal.cpp

//cal.cpp
extern "C" {int add(int a, int b) {return a + b;
}int sub(int a, int b) {return a - b;
}int mul(int a, int b) {return a * b;
}int div(int a, int b) {return a / b;
}
}

生成动态链接库libcal.so

g++ -shared -fPIC cal.cpp libcal.so
//main.cpp
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
#define LIB_LIBRARY_PATH_1 "./libcal.so"typedef int (*CAC_FUNC)(int ,int);int main() {void* handler = NULL;char* error = NULL;CAC_FUNC cac_func = NULL;handler = dlopen(LIB_LIBRARY_PATH_1, RTLD_LAZY);if (!handler) {fprintf(stderr, "err:%s\n", dlerror());exit(1);}dlerror();//此处取对应函数地址,*(void **) (&cac_func) = dlsym(handler, "add");if ((error = dlerror()) != NULL) {fprintf(stderr, "err:%s", error);exit(1);}printf("add:%d\n", cac_func(1,2));cac_func = (CAC_FUNC)dlsym(handler, "sub");printf("sub:%d\n", cac_func(1,2));cac_func = (CAC_FUNC)dlsym(handler, "mul");printf("mul:%d\n", cac_func(1,2));cac_func = (CAC_FUNC)dlsym(handler, "div");printf("div:%d\n", cac_func(1,2));dlclose(handler);return 0;
}

编译函数main:

g++ main.cpp -rdynamic -ldl

执行结果:

add:3
sub:-1
mul:2
div:0

注意问题

特别注意,若使用c++编译动态链接库,一定要在需要使用的符号处添加extern “C”,否则会出现符号找不到的问题。即undefined symbol

Linux中dlfcn库相关学习相关推荐

  1. Linux中静态库和动态库(共享库)的区别

    1. 静态库和动态库的制作过程区别 1.1 静态库的制作过程 详见博客:Linux中静态库的制作与使用 1.2 动态库的制作过程 详见博客:Linux中动态库(共享库)的制作与使用 2. 静态库和动态 ...

  2. Unix网络编程unp.h问题以及Linux中的库

    Stevens的<UNIX网络编程 卷1:套接字连网API>是一本很著名的UNIX网络编程书籍.其中使用了一个unp.h的引用,如果没有设置相应的库的话,即使引入了头文件也是没用的.所以首 ...

  3. Linux中动态库(共享库)的制作与使用

    0. 库的基本概念 见博客:Linux中静态库的制作与使用 0.1 动态库的工作原理 首先回忆一下静态库,使用静态库,在GCC进行链接时,会把静态库中代码打包到可执行程序中. 但是使用动态库,在GCC ...

  4. The driver has not received any packets from the server.(linux中关于mysql相关命令)

    原因: 1.呃呃.重启服务器,没有重新启动mysql; 2.如果还不能连接可能是3306是不允许进行远程连接的,所以在防火墙中设置3306开启远程服务: /sbin/iptables -I INPUT ...

  5. Linux中逻辑卷相关知识简介

    一.在redhat系列Linux中逻辑卷的相关介绍 LVM(Logical Volume Manager),是逻辑卷管理器,是一个软件,可以实现磁盘的高效管理,如磁盘扩展和缩减等. 它包括物理卷(Ph ...

  6. Linux绘图函数与驱动,Linux中与驱动相关的ioctl函数

    一:    ioctl函数的作用 ioctl用于向设备发控制和配置命令 ,有些命令也需要读写一些数据,但这些数据是不能用read/write读写的,称为Out-of-band数据.也就是说,read/ ...

  7. 微软官方提供的加密库相关学习

    最近在看一个sample,很长时间没有看伪代码,突然感觉有些生疏了,但是这个样本用到了RSA-2048位密钥长度的算法,一下子就又想研究研究它了,之前没想过别人是如何知道这个sample是使用了什么算 ...

  8. iOS开发中与库相关的术语

    动态库 VS 静态库 Static frameworks are linked at compile time. Dynamic frameworks are linked at runtime .f ...

  9. 简述linux中动态库和静态库的制作调用流程

    假设现在有这些文件:sub.c add.c div.c mul.c mainc head.h(前4个.C文件的头文件) 1.静态库制作流程         gcc -c  sub.c add.c di ...

最新文章

  1. 关于函数的调用是否加括号的问题
  2. 【数据工程】工具与思维结合,会爆发奇效
  3. linux下安装新硬盘并挂载mount
  4. JUnit 5 常用注解与方法
  5. 每日涉猎技术点存档(2019年02月)
  6. android什么是回调,Android中的回调是什么?
  7. Linux网络编程“惊群”问题总结
  8. vue 计算属性_lt;Vue 源码笔记系列6gt;计算属性 computed 的实现
  9. Spring4.x()---SpringAOP注解的HelloWorld
  10. WPF和Winform中picturebox图片局部放大
  11. 能解决 80% 故障的排查思路
  12. 关于IIS中Request.ServerVariables(SCRIPT_NAME)的bug
  13. 脑电信号如何反映睡眠质量和情绪波动?
  14. 【服务器】服务器运维必备软件;服务器安装环境、运维教程
  15. 用ps制作android日历步骤,PS设计制作日历
  16. 如何批量将 jpg 图片转换为 png 格式
  17. 使用python中的zellers一致性计算星期几
  18. Bada学习-多任务模式
  19. 长沙动环监控系统主要监测哪些指标呢?
  20. Jump Server

热门文章

  1. Android自带的下载功能,不需要断点续传、大文件下载、通知栏显示等窝心问题,四行代码全部搞定(经测)
  2. 虚拟数字人/直播/捏脸/3D/metahuman 实时人脸动作捕捉 开发笔记
  3. 英语语法总结15(名词性从句:同位语从句)
  4. 世间事,除了生死,哪一件不是闲事
  5. iTextPdf最简单最彻底解决中文显示
  6. 基于python的音乐数据分析可视化
  7. SpringBoot与Dubbo的集成
  8. Windows 10搭建SMB服务器
  9. 交互媒体设计之交互喷泉
  10. 我的天哪, 什么是SOA架构