Linux下动态库学习笔记
来源:互联网 发布:淘宝刻公章 不承认 编辑:程序博客网 时间:2024/06/06 10:42
Linux下动态库学习笔记
1.什么是动态库
动态库又称动态加载库(Dynamically loaded < DL > libraries),是指在程序运行过程中可以加载的库函数。DL对于实现插件和模块非常有用,因为它们可以让程序在允许时等待插件的加载。在Linux中,有专门的一组API用于完成打开动态库、查找符号、处理错误和关闭动态库等功能。
1-1. 动态库编译指令
gcc –fPIC –c src.c –o src.o
gcc –shared –o libxxx.so xx1.o xx2.o …
参数说明:
-fPIC:表明创建位置独立代码(position independent code);
-shared:共享的,即动态库
1-2. 链接库文件的搜索路径
态库链接时、执行搜索路径顺序:
a. 编译目标代码时指定的动态库搜索路径
b. 环境变量LD_LIBRARY_PATH指定的动态库搜索路径
c. 配置文件/etc/ld.so.conf中指定的动态库搜索路径
d. 默认的动态库搜索路径/lib /usr/lib
有关环境变量:
LIBRARY_PATH环境变量:指定程序静态库链接库文件搜索路径
LD_LIBRARY_PATH环境变量:指定程序动态库链接库文件搜索路径
2.Linux下使用动态库的相关API
a. dlopen打开动态库
b. dlcolse关闭动态库
c. dlsym查找符号
d. dlerror输出错误
PS使用这些API需要包含头文件
#ifndef HEAD_H#define HEAD_Hvoid printMessage();//函数的声明#endif //HEAD_H
3-1-2.创建源文件src.c
//动态库源文件#include <stdio.h>#include "head.h"//库函数void printMessage(){ printf("Hello Jllee!\n");}
3-1-3.编译源文件src.c,生成目标代码src.o
gcc -c -fPIC src.c
3-1-4.将目标代码src.o编译生成动态库libprintf.so
gcc -shared -o libprintf.so src.o
PS 以上两步可以一步到位:gcc -fPIC -shared -o libprintf.so src.c
3-1-5.编写程序main.c,使用动态库函数
#include <stdio.h>#include "head.h"#include <dlfcn.h> //包含了动态库相关API的函数声明#define DLL_FILE_NAME "./libprintf.so"typedef void(*PFUNC)();//定义函数指针的类型int main(){ //变量 void *handle; char *pstr; //void (*pfunc)(); //函数指针 PFUNC pfunc; //加载动态库 handle = dlopen(DLL_FILE_NAME, RTLD_NOW); if(NULL == handle) { //printf("加载动态库失败!\n"); fprintf(stderr, "failed to open libaray %s error:%s\n", DLL_FILE_NAME, dlerror()); return -1; } //查找库函数printMessage() pfunc = (PFUNC)dlsym(handle,"printMessage"); //判断查找是否成功 if(NULL != (pstr = dlerror())) { printf("查找库函数时出现错误:%s\n",pstr); dlclose(handle);//关闭动态库 return -1; } //调用库函数 (*pfunc)();//或者pfunc(); dlclose(handle); return 0;}
3-1-6.编译程序main.c生成可执行程序test
gcc main.c -o test -ldl
3-1-7.执行:./test
Hello Jllee!
3-2.动态库好处体现:升级动态库:新增一条打印信息:lib version:v1.2.0!
3-2-1.修改动态库源文件src.c:
//动态库源文件#include <stdio.h>#include "head.h"//库函数void printMessage(){ printf("Hello Jllee!\n"); printf("lib version:v1.2.0!\n");}
3-2-2.重编为新的动态库gcc -fPIC -shared -o libprintf.so src.c
3-2-3.执行:./test
Hello Jllee!
lib version:v1.2.0!
- Linux下动态库学习笔记
- Linux下学习动态库的笔记2
- Linux下学习动态库的笔记3
- linux动态库学习笔记
- Linux动态链接库 学习笔记
- 学习笔记: linux下静态库与动态库的生成与调用
- Linux下gcc编译器生成和使用静态库和动态库学习笔记
- Linux下gcc编译器生成和使用静态库和动态库学习笔记
- linux下使用eclipse编译、链接、动态库的学习笔记
- linux下使用eclipse编辑,链接,使用动态库的学习笔记
- linux下Qt动态库创建与调用学习笔记一(静态加载)
- Linux下静态库学习笔记
- linux下动态库
- Linux下动态库
- 动态库学习笔记
- linux qt 动态链接库 静态链接库 学习笔记
- linux qt 动态链接库 静态链接库 学习笔记
- linux qt 动态链接库 静态链接库 学习笔记
- OpenCV3.2.0的下载、安装和配置
- 使用IDA调试android下的linux程序
- HDU1693 Eat the Trees(插头dp)
- 怎样在Linux下从源代码安装SQLite3
- 第一个Netty程序
- Linux下动态库学习笔记
- Spring5:@Autowired注解、@Resource注解和@Service注解
- 使用def文件从dll导出和_declspec(dllexport)导出区别以及调用示例
- Python .pyc的编译和反编译
- SQL语句
- MySQL必知必会笔记(三)SELECT语句 联结表 高级联结 组合查询 全文本搜索
- RDD:基于内存的集群计算容错抽象
- [数学知识]求小于等于a^b的与a^b互质的数的个数与和
- HDFS原理总结