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

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 -ldl
void 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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值