`
weiyuhu
  • 浏览: 231116 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

linux C 链接库 so制作及调用[转]

阅读更多
文章分类:C++编程

[文章作者:陈毓端 若转载请标注原文链接:http://blog.woyuw.com/?p=341]

最近的一个程序因为比较复杂,需要自己编写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); // 设置了一个参数 

/*
head.h
 
*/
#include <stdio.h>
#include <stdlib.h>
void method_1(); //未设置参数
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_1.c
*/
#include "head.h"
void method_1()
{
printf("我是陈毓端,您执行的是方法1(method_1)");
}



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

/*
method_2.c
*/
#include "head.h"
void method_2(char *s)
{
printf("我是陈毓端,您执行的是方法2(method_2):%s",s);
}



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

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

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

#include  "stdio.h"
#include  "stdlib.h"
#include  "dlfcn.h"
int main()
{
void  *SoLib;
int   (*So)();
SoLib=dlopen("./method.so",RTLD_LAZY); //加载method.so
So   = dlsym( SoLib, "method_1");  //声名method_1方法
(*So)( "" );                                                  //执行method_1方法
 
So    = dlsym(SoLib, "method_2");
(*So)( "method_2" ); //设置参数
}



编译 :
Shell代码

   1. gcc work_so.c -o word_so  -ldl 

gcc work_so.c -o word_so  -ldl

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

好了这个流程完毕。







===============================万恶的分割线=========================

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics