一通百通之Linux加载库文件
刚才在网上看到一篇文章讲Linux下库文件的动态加载,代码很简单:
linux下动态加载库主要使用以下几个函数:
void *dlopen(const char *filename, int flag);
void *dlsym(void *handle, const char *symbol);
int dlclose(void *handle);
分别对应了打开,加载和关闭
dlopen中filename为库所在的位置,falg一般最多使用RTLD_LAZY和RTLD_NOW分别对应使用时加载和立即加载
其会返回一个void指针,对应于dlsym中的第一个参数。
dlsym中handle即为dlopen的返回值,symbol以字符串出现,对应库中定义的函式的名称,返回指向该函式的指针
dlclose则应在不用该库时调用,自然是关闭它了。
假设某库中有一个函式声明如下
void println(const char * );
下面给一段超级简单的例子
#include <dlfcn.h>
typedef void (*Func)(const char * );
int main()
{
void * handle;
Func func;
char *tmp="abc";
handle=dlopen("./lib.so",RTLD_LAZY);
if(handle==NULL)
{
perror("oops, handle set abnormal");
}
func=(Func)dlsym(handle,"println");
func(tmp);
dlclose(handle);
return 0;
}
那段代码怎么看着那么眼熟呢?wow!原来和《C语言也能干大事》第二十一节里讲的Windows下动态加载dll动态链接库的代码差不多呀:
typedef int(__cdecl* FunctionAdd)(int,int);
HMODULE hModule;
FunctionAdd add;
hModule = LoadLibrary("dll1.dll");//调试时hModule为0x10000000
if(NULL==hModule )
{
//error.
}
add=(FunctionAdd)GetProcAddress(hModule,"add");
int r = add(1,1);
FreeLibrary(hModule);
dlopen就相当于LoadLibrary,dlsym就相当于GetProcAddress,dlclose就相当于FreeLibrary!
Windows下加载dll是:定义函数指针、LoadLibrary加载动态库、GetProcAddress得到函数指针、通过函数指针调用函数、FreeLibrary释放链接库。Linux底下是:定义函数指针、dlopen加载动态库、dlsym得到函数指针、通过函数指针调用函数、dlclose释放链接库。
也许你看这两段代码完全不一样,可是在我眼中则是完全一样!!!
难道我也到达了看透事物本质,一通百通的水平?一通百通伟大思想万岁!哈哈,兴奋ing……
看来把Windows底下编程真正玩熟了以后需要弄Linux编程也是易如反掌呀!!!好好继续学习研究Windows下C编程,玩深了、玩儿熟了,希望有一点我也能三天掌握Linux编程!
一通百通之Linux加载库文件相关推荐
- php 加载库文件_php 如何调用dll文件内接口,求大神帮忙谢谢。
1.他们给了一个libcryptAPIc_1.dll这种类型的组件,是用C写的. 2.解密文件时,先调用提供的加解密组件中,因子密文解密方法DesCrypt1,将因子密文解密,返回因子: 3.调用提供 ...
- 如何让linux加载当前目录的动态库
debian从7.0开始支持multiarch,64位库的路径改到/usr/lib/x86_64-linux-gnu了,mint.ubuntu这些衍生版有没有跟着改我就不清楚了. deepin lin ...
- Linux下的静态库、动态库和动态加载库
from: http://www.techug.com/linux-static-lib-dynamic-lib 库的存在极大的提高了C/C++程序的复用性,但是库对于初学者来说有些难以驾驭,本文从L ...
- linux dlopen 内存,Linux下加载库的有关问题(dlopenm, dlsym)
Linux下加载库的问题(dlopenm, dlsym) 如题, 程序中发现load库成功,但是加载函数的时候报错: undefined symbol functionname 是很简单的一个东西,因 ...
- Ubuntu16.04安装PCL库的python实现python-pcl,并且通过pcl加载pcd文件验证python-pcl是否安装成功
1. 安装PCL库 使用如下指令安装PCL库. sudo apt install libpcl-dev 如果提示"Unable to locate package libpcl-dev&qu ...
- Linux复制文件到usb设备中,使用shell脚本实现USB设备的加载与文件复制
使用shell脚本实现USB设备的加载与文件复制 在Linux操作系统中,如果插入一个USB设备,需要用mount挂载命令才能实现这个设备的加载,下面写一个USB设备挂载与文件复制的Shell程序,程 ...
- iOS CocoaPods第三方库加载本地文件或服务器上的zip文件(二)
本篇文章重点介绍,如何加载zip文件压缩包第三方库.如果伙伴们想了解如何加载本地文件请自行翻看上篇文件. 方案: 不废话,直接上代码!编辑我们的WechatOpenSDK.podspec文件: Pod ...
- Compose-jb图片加载库load-the-image,适用于KMM Compose desktop桌面端(Windows,Linux,MacOs)
前言 Android平台上有很多优秀的图片加载框架,比如Glide,Picasso,Fresco 而Compose-jetpack上的图片加载框架有Coil 但Compose-jb上却暂时没有图片加载 ...
- linux 加载ISO镜像文件
linux 加载ISO镜像文件 举例: mount -oloop update-ucs-20140506.iso /media
最新文章
- Visual Studio 2010 Ultimate敏捷功能特性(上)
- 在几何画板中如何制作圆柱的侧面展开动画_基本尺规作图过程展示 | 几何画板...
- JENKINS+maven+ssh+shell 完成自动化部署工具的开发
- 省选专练 [SHOI2001]小狗散步
- java质数和合数的程序_《java项目实训》课程设计计算器.doc
- 获取类路径的方法之一
- 深入研究java.lang.Runtime类,Process类
- 任务调度框架 Quartz 用法指南「超详细」
- 扫描到计算机桌面,win7怎么扫描文件到电脑上?扫描文件到win7电脑的两种方法...
- Golang go mod 使用
- 通过js实现电灯开关案例
- Django Rest_framework 1(RESTRESTful)
- php 图片抠图,php 图像处理 抠图,生成背景透明png 图片
- 字典(dict)的反转
- html中p元素添加超链接_如何在HTML中添加超链接
- armbian系统实现服务器重启后自动运行指令及解决rc.local和rc-local.service出现的错误
- 实现用户一键登录的方案有哪些?
- 从《西游》《魔界》看东西方的团队与项目管理
- 双变量polynomial commitment
- 20190309【原创】下载B站外挂字幕(cc字幕)的方法
热门文章
- 关于iframe嵌套页面传值
- SQLite数据库中rowid使用
- python socket传输图片
- 如何将AI转换为JPG
- nodejs mysql嵌套查询_node.js,_nodejs mysql查询内嵌套修改,node.js - phpStudy
- cordova+codepush 热更新实践 (微软 cordova-plugin-code-push)
- Mysql性能分析关键字Explain详解(附例子 )
- Knocknock 登陆韩国 Kakao 公链 Klaytn
- Array Nesting
- 如何修改github上的头像