linux C 链接库 so制作及调用 (转)
注1:dlopen调用要用完全路径。(使用时总结)
最近的一个程序因为比较复杂,需要自己编写so动态链接库来给c语言程序调用。
下面就简单的写下so制作到调用的整个流程。
首先做个头文件
head.h:
C代码
- /*
- head.h
- */
- #include <stdio.h>
- #include <stdlib.h>
- void method_1(); //未设置参数
- void method_2(char *s); // 设置了一个参数
method_1.c:
C代码
- /*
- method_1.c
- */
- #include "head.h"
- void method_1()
- {
- printf("我是陈毓端,您执行的是方法1(method_1)");
- }
method_2.c
C代码
- /*
- method_2.c
- */
- #include "head.h"
- void method_2(char *s)
- {
- printf("我是陈毓端,您执行的是方法2(method_2):%s",s);
- }
关键一步,生成so(动态链接库)
Shell代码
- gcc head.h method_1.c method_2.c -fPIC -shared -o method.so
到现在 method.so 文件已经制做完毕。
接下来是调用
work_so.c:
C代码
- #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代码
- gcc work_so.c -o word_so -ldl
不出意外 结果为:
我是陈毓端,您执行的是方法1(method_1)我是陈毓端,您执行的是方法1(method_2):method_2
好了这个流程完毕。