一通百通之Linux加载库文件

本文对比了Linux和Windows环境下动态链接库的加载过程,介绍了Linux下的dlopen、dlsym、dlclose函数与Windows下的LoadLibrary、GetProcAddress、FreeLibrary函数的功能与使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 刚才在网上看到一篇文章讲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编程!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值