Linux下学习动态库的笔记3
来源:互联网 发布:软件钉钉有什么用处 编辑:程序博客网 时间:2024/06/05 05:44
动态库的显示调用(动态加载):
1.编写动态库函数代码:
//myAddLib.h
/************************************************************* FileName : myAddLib.h FileFunc : 定义头文件 Version : V0.1 Author : Sunrier Date : 2012-05-03 Descp : Linux下实现动态库 *************************************************************/#ifndef _MYADDLIB_H_ #define _MYADDLIB_H_ #ifdef __cplusplusextern "C" {#endifint add(int ,int );#ifdef __cplusplus}#endif#endif
//myAddLib.c
/************************************************************* FileName : myAddLib.c FileFunc : 定义动态库实现文件 Version : V0.1 Author : Sunrier Date : 2012-05-03 Descp : Linux下实现动态库 *************************************************************/#include <stdio.h>int add(int iArg1,int iArg2){ printf("iArg1= %d , iAgr2= %d \n",iArg1,iArg2); return (iArg1+iArg2);}
2.制作库文件:
#gcc -fpic myAddLib.c //创建.o文件
#gcc -shared -o libmyAddLib.so myAddLib.o //创建so
或者
#gcc -fpic -shared -o libmyAddLib.so myAddLib.c //直接创建so
-fpic:产生位置无关代码
-shared:生成共享库
注意:库文件名一定要以lib打头, .so结尾
执行完后会生成libmyAddLib.so动态函数库
3.使用库文件:
1)编写测试动态库文件程序
//testAddLib.c
/************************************************************* FileName : testAddLib.c FileFunc : 测试动态库文件 Version : V0.1 Author : Sunrier Date : 2012-05-03 Descp : Linux下实现动态库 *************************************************************/#include <stdio.h>#include <dlfcn.h>#define SOFILE "./libmyAddLib.so"int main(int argc,char *argv[]){ int iNumber1,iNumber2,iSum = 0; void *hdl = NULL;//动态库句柄 hdl = dlopen(SOFILE,RTLD_LAZY);//打开动态链接库 if( NULL==hdl ) { printf("No libmyAddLib.so file\n"); return 1; } /*函数指针*/ int(*add)(int,int); add = dlsym(hdl,"add");//查找符号表,定位共享函数 char *error = dlerror();//检测错误 if( error ) { printf("No function!\n"); return 1; } iNumber1 = 10; iNumber2 = 20; iSum = add(iNumber1,iNumber2);//调用此共享函数 //iSum = (*add)(iNumber1,iNumber2);//调用此共享函数 printf("iSum=%d\n",iSum); printf("Hello Sunrier!\n"); dlclose(hdl);//关闭共享库 hdl =NULL; return 0;}
使用到了四个函数(头文件dlfcn.h):
dlopen():打开动态库,第一个参数问文件名,第二个参数是打开方式一般为RTLD_LAZY.成功则返回"句柄",否则返回NULL
dlsym():获取动态库中的函数指针,第一个参数为句柄,第二个参数是函数名
dlerror():检查操作是否失败,失败返回错误字符串.否则返回NULL
dlclose():关闭动态库
2)编译目标文件
#gcc testAddLib.c -o testAddLib -ldl
-ldl是连接dl,即上面四个函数的实体。
3)执行可执行文件
[root@localhost Sunrier]# ./testAddLib
iArg1= 10 , iAgr2= 20
iSum=30
Hello Sunrier!
[root@localhost Sunrier]#
- Linux下学习动态库的笔记3
- Linux下学习动态库的笔记2
- Linux下动态库学习笔记
- 学习笔记: linux下静态库与动态库的生成与调用
- linux下使用eclipse编译、链接、动态库的学习笔记
- linux下使用eclipse编辑,链接,使用动态库的学习笔记
- linux动态库学习笔记
- LINUX下动态库及静态库的学习记录
- linux下的动态库
- linux下的动态库
- linux下的动态库
- Linux下的动态库
- linux下的动态库
- Linux动态链接库 学习笔记
- Linux下gcc编译器生成和使用静态库和动态库学习笔记
- Linux下gcc编译器生成和使用静态库和动态库学习笔记
- linux下Qt动态库创建与调用学习笔记一(静态加载)
- Linux学习笔记3--linux下库文件的创建和使用及其他
- Android4.0编译源码时出现的:<命令行>:0:0: 错误: “_FORTIFY_SOURCE”重定义 [-Werror]
- 【ORA-16196】一个实例在其生命周期里最多只能装载和打开一个数据库
- Keil C51中,char 强整型为 bit
- oRTP移植到DM6446
- Debian+subversion进行版本控制
- Linux下学习动态库的笔记3
- NX Nastran 节点遍历的方法/FEA Nodes iteration in NX Nastran by NXOpen
- zed graph使用经验
- Fixing the Date Format Issue in Azure Reporting CTP
- thrift简介
- java.util.Arrays.fill()的使用概谈
- 千万级并发HAproxy均衡负载系统介绍
- 使用SurfaceView开发遇到的一些问题
- 黑马程序员——Java API