嵌入式学习24(静态库,动态库)

来源:互联网 发布:淘宝卖家祝福语范文 编辑:程序博客网 时间:2024/06/05 15:42

1、函数执行条件:声明+定义(链接函数体使之成为程序一部分),才能使用这个函数

2、概念
静态库:成为可执行文件的一部分(在链接时,编译器将此库链接成程序的一部分)
拷贝一份进来
优点:不会因此库文件的丢失而运行失败 缺点:维护与更新困难。
动态库:需要的时候导入。(当此程序需要某个模块时,系统此时才会将此程序导入到内存,并调用此函数。当此模块不再需要使用时,系统会释放此模块)
优先:更新于维护简单
缺点:当可文件丢失时,可能会造成运行失败

3、使用方法
静态库:将目标文件打包成一个库文件
步骤:

  • 编辑源文件 vi fun.c
  • 编译成目标文件gcc –c fun.c –o fun.o(目标文件是二进制文件,别人看不懂)
  • 打包成静态库: ar -crv libfun.a fun.o(规定名字必须以lib开头 .a后缀)
  • 链接: gcc/g++ main.c(源文件) -L./ -lfun -lm -o main
    自定义库 系统库(看情况自行决定)

    动态库:并不是编译时将动态库链接成可执行文件的一部分,而是运行时需要此动态库时才导入此库文件。
    注:如果两个库(动态库与静态库)同时存在(同名),以动态库优先。
    方法一:共享

  • 编写源文件
  • 生成可执行的库文件 gcc/g++ -fPIC –shared 源文件 –o lib文件名.so
  • 添加当前路径:export LD_LIBRARY_PATH=”$LD_LIBRARY_PATH;./”
    或添加到系统库中
  • 运行程序
    这里写图片描述

    示例代码

#include<stdio.h>#include<dlfcn.h>//link with -ldlvoid main(){    char* path="./libfun.so";//函数所在动态库库名    char* fun_name="sort";//函数名    char* error=NULL;//用于反馈错误//1 打开  库指针       路径   打开方式                  void* handle=dlopen(path,RTLD_LAZY);    if(NULL!=(error=dlerror()))//如果存在错误    {        printf("error:%s\n",error);        return;    }//2 从动态库中找匹配的入口地址(函数名)    void (*pfun)(int*,int);    pfun=dlsym(handle,fun_name);    if(NULL!=(error=dlerror()))//如果存在错误    {        printf("error:%s\n",error);        dlclose(handle);//释放        return;    }//3 调用    int a[5]={5,4,3,2,1};    pfun(a,5);    int i;    for(i=0;i<5;i++)            printf("%d",a[i]);//4 关闭    dlclose(handle);}
原创粉丝点击