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!

原创粉丝点击