Linux 调用动态库(.SO文件)总结

       像window调用库文件一样,在linux下,也有相应的API因为加载库文件而存在。它们主要是以下几个函数:
函数名功能描述
dlopen打开对象文件,使其可被程序访问
dlsym获取执行了 dlopen 函数的对象文件中的函数的地址
dlerror该函数没有参数,它会在发生前面的错误时返回一个字符串,同时将其从内存中清空; 在没有错误发生时返回 NULL,
dlclose

关闭目标文件。如果无需再调用共享对象的话,应用程序可以调用该方法来通知操作系统不再需要句柄和对象引用了。它完全是按引用来计数的,所以同一个共享对象的多个用户相互间不会发生冲突(只要还有一个用户在使用它,它就会待在内存中)。任何通过已关闭的对象的 dlsym 解析的符号都将不再可用

 

 

 

 

 

 

     

 

 

 

       实例代码(soTest.c):

复制代码
 1 #include <stdio.h>
 2 #include <dlfcn.h>
 3 
 4 int main(int argc, char *argv[]){
 5     void * libm_handle = NULL;
 6     float (*cosf_method)(float);
 7     char *errorInfo;
 8     float result;
 9     
10     // dlopen 函数还会自动解析共享库中的依赖项。这样,如果您打开了一个依赖于其他共享库的对象,它就会自动加载它们。
11     // 函数返回一个句柄,该句柄用于后续的 API 调用
12     libm_handle = dlopen("libm.so", RTLD_LAZY );
13     // 如果返回 NULL 句柄,表示无法找到对象文件,过程结束。否则的话,将会得到对象的一个句柄,可以进一步询问对象
14     if (!libm_handle){
15         // 如果返回 NULL 句柄,通过dlerror方法可以取得无法访问对象的原因
16         printf("Open Error:%s.\n",dlerror());
17         return 0;
18     }
19 
20     // 使用 dlsym 函数,尝试解析新打开的对象文件中的符号。您将会得到一个有效的指向该符号的指针,或者是得到一个 NULL 并返回一个错误
21     cosf_method = dlsym(libm_handle,"cosf");
22     errorInfo = dlerror();// 调用dlerror方法,返回错误信息的同时,内存中的错误信息被清空
23     if (errorInfo != NULL){
24         printf("Dlsym Error:%s.\n",errorInfo);
25         return 0;
26     }
27 
28     // 执行“cosf”方法
29     result = (*cosf_method)(0.0);
30     printf("result = %f.\n",result);
31     
32     // 调用 ELF 对象中的目标函数后,通过调用 dlclose 来关闭对它的访问
33     dlclose(libm_handle);
34 
35     return 0;
36 }
复制代码

 

       在这个例子中主要是调用了 math 库(libm.so)中的“cosf”函数,dlopen函数的第二个参数表示加载库文件的模式,主要有两种:RTLD_LAZY 暂缓决定,等有需要时再解出符号;RTLD_NOW 立即决定,返回前解除所有未决定的符号。另外记得引用包含API的头文件“#include <dlfcn.h>”(^_^)。

      编译执行结果如下:

      如果将代码12行中的库文件名改为一个不存在的库文件,运行后错误结果如下:

      如果将代码21行中的函数名改为一个不存在的函数名,运行后错误结果如下:

     

      本文主要简单讲述在linux下调用SO库文件的一些基本知识和注意点。

      本实例在redhat 5.2的64系统下测试通过。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值