linux C 链接库 so制作及调用 (转)

注1:dlopen调用要用完全路径。(使用时总结)

 

最近的一个程序因为比较复杂,需要自己编写so动态链接库来给c语言程序调用
下面就简单的写下so制作到调用的整个流程。
首先做个头文件

head.h:

C代码 
  1. /*  
  2. head.h  
  3.    
  4. */   
  5. #include <stdio.h>   
  6. #include <stdlib.h>   
  7. void method_1(); //未设置参数   
  8. void method_2(char *s); // 设置了一个参数  

 

method_1.c:

C代码 
  1. /*  
  2.  method_1.c  
  3. */   
  4. #include "head.h"   
  5. void method_1()   
  6. {   
  7. printf("我是陈毓端,您执行的是方法1(method_1)");   
  8. }  

 

method_2.c

C代码 
  1. /*  
  2. method_2.c  
  3. */   
  4. #include "head.h"   
  5. void method_2(char *s)   
  6. {   
  7. printf("我是陈毓端,您执行的是方法2(method_2):%s",s);   
  8. }  

 

关键一步,生成so(动态链接库)

Shell代码 
  1. gcc head.h method_1.c method_2.c -fPIC -shared -o method.so  

 

到现在 method.so 文件已经制做完毕。

接下来是调用
work_so.c:

C代码 
  1. #include  "stdio.h"   
  2. #include  "stdlib.h"   
  3. #include  "dlfcn.h"   
  4. int main()   
  5. {   
  6. void  *SoLib;   
  7. int   (*So)();   
  8. SoLib=dlopen("./method.so",RTLD_LAZY); //加载method.so   
  9. So   = dlsym( SoLib, "method_1");  //声名method_1方法   
  10. (*So)( "" );                                                  //执行method_1方法   
  11.     
  12. So    = dlsym(SoLib, "method_2");   
  13. (*So)( "method_2" ); //设置参数   
  14. }  

 

编译 :

Shell代码 
  1. gcc work_so.c -o word_so  -ldl  

 不出意外 结果为:
我是陈毓端,您执行的是方法1(method_1)我是陈毓端,您执行的是方法1(method_2):method_2

好了这个流程完毕。

posted @ 2011-09-05 17:26  杭州桓泽  阅读(355)  评论(0编辑  收藏  举报