刚才在网上看到一篇文章讲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加载库文件相关推荐

  1. php 加载库文件_php 如何调用dll文件内接口,求大神帮忙谢谢。

    1.他们给了一个libcryptAPIc_1.dll这种类型的组件,是用C写的. 2.解密文件时,先调用提供的加解密组件中,因子密文解密方法DesCrypt1,将因子密文解密,返回因子: 3.调用提供 ...

  2. 如何让linux加载当前目录的动态库

    debian从7.0开始支持multiarch,64位库的路径改到/usr/lib/x86_64-linux-gnu了,mint.ubuntu这些衍生版有没有跟着改我就不清楚了. deepin lin ...

  3. Linux下的静态库、动态库和动态加载库

    from: http://www.techug.com/linux-static-lib-dynamic-lib 库的存在极大的提高了C/C++程序的复用性,但是库对于初学者来说有些难以驾驭,本文从L ...

  4. linux dlopen 内存,Linux下加载库的有关问题(dlopenm, dlsym)

    Linux下加载库的问题(dlopenm, dlsym) 如题, 程序中发现load库成功,但是加载函数的时候报错: undefined symbol functionname 是很简单的一个东西,因 ...

  5. 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 ...

  6. Linux复制文件到usb设备中,使用shell脚本实现USB设备的加载与文件复制

    使用shell脚本实现USB设备的加载与文件复制 在Linux操作系统中,如果插入一个USB设备,需要用mount挂载命令才能实现这个设备的加载,下面写一个USB设备挂载与文件复制的Shell程序,程 ...

  7. iOS CocoaPods第三方库加载本地文件或服务器上的zip文件(二)

    本篇文章重点介绍,如何加载zip文件压缩包第三方库.如果伙伴们想了解如何加载本地文件请自行翻看上篇文件. 方案: 不废话,直接上代码!编辑我们的WechatOpenSDK.podspec文件: Pod ...

  8. Compose-jb图片加载库load-the-image,适用于KMM Compose desktop桌面端(Windows,Linux,MacOs)

    前言 Android平台上有很多优秀的图片加载框架,比如Glide,Picasso,Fresco 而Compose-jetpack上的图片加载框架有Coil 但Compose-jb上却暂时没有图片加载 ...

  9. linux 加载ISO镜像文件

    linux 加载ISO镜像文件 举例: mount -oloop update-ucs-20140506.iso /media

最新文章

  1. Visual Studio 2010 Ultimate敏捷功能特性(上)
  2. 在几何画板中如何制作圆柱的侧面展开动画_基本尺规作图过程展示 | 几何画板...
  3. JENKINS+maven+ssh+shell 完成自动化部署工具的开发
  4. 省选专练 [SHOI2001]小狗散步
  5. java质数和合数的程序_《java项目实训》课程设计计算器.doc
  6. 获取类路径的方法之一
  7. 深入研究java.lang.Runtime类,Process类
  8. 任务调度框架 Quartz 用法指南「超详细」
  9. 扫描到计算机桌面,win7怎么扫描文件到电脑上?扫描文件到win7电脑的两种方法...
  10. Golang go mod 使用
  11. 通过js实现电灯开关案例
  12. Django Rest_framework 1(RESTRESTful)
  13. php 图片抠图,php 图像处理 抠图,生成背景透明png 图片
  14. 字典(dict)的反转
  15. html中p元素添加超链接_如何在HTML中添加超链接
  16. armbian系统实现服务器重启后自动运行指令及解决rc.local和rc-local.service出现的错误
  17. 实现用户一键登录的方案有哪些?
  18. 从《西游》《魔界》看东西方的团队与项目管理
  19. 双变量polynomial commitment
  20. 20190309【原创】下载B站外挂字幕(cc字幕)的方法

热门文章

  1. 关于iframe嵌套页面传值
  2. SQLite数据库中rowid使用
  3. python socket传输图片
  4. 如何将AI转换为JPG
  5. nodejs mysql嵌套查询_node.js,_nodejs mysql查询内嵌套修改,node.js - phpStudy
  6. cordova+codepush 热更新实践 (微软 cordova-plugin-code-push)
  7. Mysql性能分析关键字Explain详解(附例子 )
  8. Knocknock 登陆韩国 Kakao 公链 Klaytn
  9. Array Nesting
  10. 如何修改github上的头像