Linux下学习动态库的笔记3
2012-05-03 10:24
211 查看
动态库的显示调用(动态加载):
1.编写动态库函数代码:
//myAddLib.h
//myAddLib.c
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
使用到了四个函数(头文件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]#
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 __cplusplus extern "C" { #endif int 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下使用eclipse编辑,链接,使用动态库的学习笔记
- Linux下gcc编译器生成和使用静态库和动态库学习笔记
- 学习笔记: linux下静态库与动态库的生成与调用
- [学习备忘录]Linux平台静态库、动态库的一些笔记
- Linux下学习动态库的笔记2
- 自己在linux上编译、链接、动态库和静态库的学习笔记
- linux下使用eclipse编译、链接、动态库的学习笔记
- Linux学习笔记7——linux中的静态库和动态库
- Linux下gcc编译器生成和使用静态库和动态库学习笔记
- Linux下动态库学习笔记
- 自己在linux上编译、链接、动态库和静态库的学习笔记
- 自己在linux上编译、链接、动态库和静态库的学习笔记
- Linux内核学习笔记三——进程调度
- Linux学习笔记4-三种不同类型的软件的安装(绿色软件、rpm软件、源代码软件)
- Linux学习笔记——Linux高级命令详解及示例
- Linux进程间的通信——守护进程学习笔记
- python3.5学习笔记:linux6.4 安装python3 pip setuptools
- Linux 编程学习笔记----ANSI C 文件I/O管理
- c++ 学习笔记(高级linux编程) day7
- Linux学习笔记之 Grub简单介绍