注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

逍遥子 曰:

得失失得 何必患得患失 舍得得舍 不妨不舍不得

 
 
 

日志

 
 

Linux共享类库 so使用学习[转]  

2012-09-09 00:33:14|  分类: linux c/c++开发 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

采用下面几个函数加载动态库

  头文件:dlfcn.h 2.1.1 dlerror

  原型为: const char *dlerror(void);

  当动态链接库操作函数执行失败时,dlerror可以返回出错信息,返回值为NULL时表示操作函数执行成功。

  2.1.2 dlopen

  原型为: void *dlopen (const char *filename, int flag);

  dlopen用于打开指定名字(filename)的动态链接库,并返回操作句柄。

  filename: 如果名字不以/开头,则非绝对路径名,将按下列先后顺序查找该文件。

  (1) 用户环境变量中的LD_LIBRARY值;

  (2) 动态链接缓冲文件/etc/ld.so.cache

  (3) 目录/lib,/usr/lib

  flag表示在什么时候解决未定义的符号(调用)。取值有两个:

  1) RTLD_LAZY : 表明在动态链接库的函数代码执行时解决。

  2) RTLD_NOW : 表明在dlopen返回前就解决所有未定义的符号,一旦未解决,dlopen将返回错误。

  dlopen调用失败时,将返回NULL值,否则返回的是操作句柄。

  2.1.3 dlsym : 取函数执行地址

  原型为: void *dlsym(void *handle, char *symbol);

  dlsym根据动态链接库操作句柄(handle)与符号(symbol),返回符号对应的函数的执行代码地址。由此地址,可以带参数执行相应的函数。

  如程序代码: void (*add)(int x,int y); /* 说明一下要调用的动态函数add */

  add=dlsym("xxx.so","add"); /* 打开xxx.so共享库,取add函数地址 */

  add(89,369); /* 带两个参数89和369调用add函数 */

  2.1.4 dlclose : 关闭动态链接库

  原型为: int dlclose (void *handle);

  dlclose用于关闭指定句柄的动态链接库,只有当此动态链接库的使用计数为0时,才会真正被系统卸载。2.2 在程序中使用动态链接库函数。

  用例程序:

  1、method1.cpp

  #include "head.h"

  //extern "C" void method_1()

  A* method_1()

  {

  printf("I am one\n");

  return new A();

  }

  2、method2.cpp

  #include "head.h"

  void method_2(char *s)

  {

  printf("I am two : %s\n",s);

  }

  3、head.h

  #include

  #include

  #include

  using namespace std;

  class A

  {

  public:

  void Print()

  {

  printf("what\n");

  }

  };

  extern "C" A* method_1();

  extern "C" void method_2(char* s);

  4\work_so 文件:

  #include "stdio.h"

  #include "stdlib.h"

  #include "dlfcn.h" //add dlopen comm head

  #include "head.h"

  typedef A* (*FunPtr)();

  typedef void (*FunPtr2)(char*);

  int main()

  {

  void *SoLib;

  //typedef void (*FunPtr)();

  FunPtr So;

  FunPtr2 So2;

  SoLib=dlopen("./method.so",RTLD_LAZY);

  const char *err = dlerror();

  if(err != NULL)

  {

  fputs(err, stderr);

  exit(1);

  }

  So = (FunPtr)dlsym( SoLib, "method_1");

  A* a=(*So)();

  a->Print();

  So2 = (FunPtr2)dlsym(SoLib, "method_2");

  (*So2)("method_2");

  return 0;

  }

  5、makefile

  all:

  g++ head.h method_1.cpp method_2.cpp -fPIC -shared -o method.so

  g++ work_so.cpp -o work_so -ldl

  评论这张
 
阅读(475)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018