• 嵌入式养成计划-34--函数库


    七十二、 函数库

    1. 库的概念

    1. 库是一个二进制可执行文件,与二进制可执行程序比较,库是不能单独运行的。

      1. 库中存放的是功能函数,没有主函数(main函数)

      2. 库需要被载入到内存中使用

      3. 标准的基础库中存放了很多已经写好的,成熟的,可以复用的功能代码,例如printf, scanf

    2. 不同操作系统有自己的库,不兼容

    • 库的分类
      1. 静态库
      2. 动态库
    windowsLinux
    静态库*.lblibxxx.a
    动态库*.dlllibxxx.so

    2. 静态库

    1)原理

    通过静态库封装的功能函数,在程序编译到 链接库 步骤的时候,会将函数 继承 到可执行程序中。

    优点:

    1. 程序运行的时候,与静态库没有任何关系,方便移植。
    2. 运行速度比动态库快

    缺点:

    1. 大。存储的时候浪费磁盘空间,运行的时候浪费内存空间。
    2. 程序更新部署比较麻烦。

    2)制作指令

    gcc -c func.c -o func.o         一步完成预处理,编译,汇编
    ar -crs libxxx.a func.o         生成一个静态库,库的名字叫做xxx
    
    ar -crs libxxx.a func1.o func2.o  func3.o
    
    • 1
    • 2
    • 3
    • 4

    ar : 用于创建或操作静态库

    -c : 创建静态库

    -r : 将文件插入静态库或者替换静态库中的同名文件;

    -s : 重置静态库索引

    3)制作流程

    1. 分文件,将主函数与功能函数分开,例如分成:main.c func.c
    2. 编写头文件,例如:func.h
    3. 将main.c和func.c联合编译,验证分文件是否正确
    4. 调用上述静态库制作指令,创建一个静态库libxxx.a。注意静态库的名字是xxx
    5. 根据下面的使用方式,链接静态库即可

    4)使用方式

    gcc main.c -L库的路径 -l库的名字 最终生成一个a.out可执行二进制程序 gcc main.c -L库的路径 -l库的名字 -o main 最终生成一个main可执行二进制程序 -l:小写的L

    3. 动态库(共享库)

    1)原理

    用动态库封装的功能函数,把库函数的链接推迟到 程序运行 的时候。

    当程序执行到库函数的时候,会到内存中找动态库函数。

      1. 若内存中不存在该动态库函数,则会将该动态库函数加载到内存中
      2. 若内存中存在该动态库函数,则直接调用动态库函数,不会加载第二份

    优点:

    1. 小,存储的时候节省磁盘空间,运行的时候节省内存空间
    2. 程序的更新部署比较方便,不需要重新编译烧录。

    缺点:

    1. 程序运行的时候,若没有找到对应动态库函数,则会导致程序崩溃。
    2. 运行速度比静态库慢

    2)制作指令

    gcc -fPIC -c func.c -o func.o     完成预处理 编译 汇编
    gcc -shared -o libxxx.so func.o   生成一个动态库,库的名字是xxx;
    
    gcc -shared -o libxxx.so func1.o func2.o func3.o
    
    • 1
    • 2
    • 3
    • 4

    3)制作流程

    1. 分文件,将主函数与功能函数分开,例如分成:main.c func.c
    2. 编写头文件,例如:func.h
    3. 将main.c和func.c联合编译,验证分文件是否正确
    4. 调用上述动态库制作指令,创建一个动态库libxxx.so。注意动态库的名字是xxx
    5. 根据下面的使用方式,链接动态库即可

    4)使用方式

    在这里插入图片描述

    原因:环境变量没有配置,若没有配置,则会默认到/lib/ 或者 /usr/lib/ 目录下查找动态库

    5)环境变量配置

    1. 将动态库移动到 /lib/ 或者 /usr/lib/
    sudo mv ./libmyfunc.so /lib/
    
    • 1
    1. 在LD_LIBRARY_PATH这个环境变量中加上库所在的绝对路径
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:动态库所在目录的绝对路径
    
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/ubuntu/mydir/23071/02_socket/09_library/
    只在设置终端有效
    
    • 1
    • 2
    • 3
    • 4
    1. 修改配置文档

    1. cd  /etc/ld.so.conf.d
    2. sudo  touch  xxx.conf  (xxx自定义可以修改)
    3. sudo vim  xxx.conf   将动态库所在目录的绝对路径写入到文件中,且一行一个动态库目录路径。
    4. 保存退出后,终端输入 sudo ldconfig 刷新环境变量
    
    • 1
    • 2
    • 3
    • 4
  • 相关阅读:
    Sunlogin RCE漏洞分析和使用
    光栅区域衍射级数和效率的规范
    第十七章 开发Productions - ObjectScript Productions - 对业务服务、流程和操作进行编程
    android 9 adb安装过程学习(二)
    CSS 外边距、填充、分组嵌套、尺寸
    简述 happens - before 八大规则
    动画圆圈文字标志效果
    阿里10年架构师:由Java多线程+MySQL+JVM出发怎样做好职业规划?
    每日一题(set集合)-874. 模拟行走机器人
    Redis常见异常汇总
  • 原文地址:https://blog.csdn.net/qq_52625576/article/details/133661870