当前位置: 首页 > news >正文

Linux高并发服务器开发 第七天(静态库 动态库)

目录

0.动态库和静态库

1.静态库

1.1简述

1.2制作

2.动态库(共享库)

2.1简介

重点强调

2.2制作


0.动态库和静态库

- 本质:一组函数。具有相近的功能或操作同一数据结构。
    - <string.h> : strcpy/strcmp/strcat/strlen/strstr/strchr/strtok ....
    - 自定义库:<mysort.h> : bubble_sort / select_sort/ quick_sort / insert_sort ....
- 作用:
    1. 代码复用。
    2. 程序积累。
- 发布形式:
    1. 源码形式:
        - 优点:方便使用者学习和使用。
        - 缺点:1. 保密性差。2. 编译程序耗时。3. 编译受平台、版本限制。
    2. 二进制形式:
        - 优点、缺点,与上述相反。

- 我们使用的函数: 标准C库:/lib/x86_64-linux-gnu/libc.so.6

1.静态库

1.1简述

- 机制:在编译程序时,复制静态库的代码片,到可执行程序中。
- 优点:将函数库中的函数本地化。寻址方便,速度快。(库函数执行效率 == 自定义函数执行效率)
- 缺点:消耗系统资源大,每个使用静态库的程序,都要复制一份,静态库。浪费内存。
- 使用场景:多用于核心程序,保证时效性,可以忽略空间。

- 静态库使用的原理:

1.2制作

1. 生成 *.o 目标文件。

2. 制作静态库
    ar rcs lib静态库名.a add.o sub.o mul.o
        # ar:制作静态库的工具。 gcc 不具备制作静态库功能。
        # r:更新。c:创建(可省)。s:建立索引。
        # 静态库库名,必须lib开头,以.a 。 --- 使用 file lib静态库名.a 查看。

 

3. 使用静态库

4. 查看静态库
    file libmymath.a
    libmymath.a: current ar archive

2.动态库(共享库)

2.1简介

- 机制:代码共享。

- 优点:节省内存(共享)、易于更新(动态链接)

- 缺点:相较于静态库而言,函数调用速度慢(函数地址“延时绑定”)

- 使用场景:

    1. 对程序执行速度要求不是很强烈,而对系统资源有一定要求的场景。
    2. 对应更新比较频繁程序。
        1. 停止运行程序
        2. 使用新库覆盖旧库(保证新库、旧库名称一致。接口一致。)
        3. 重启程序。

重点强调

1. 动态库是否加载到内存,取决于 “程序是否运行”。
2. 动态库加载至内存的位置,不固定。

2.2制作

1. 生成与位置无关的 目标文件(-fPIC):

2. 制作动态库

3. 测试使用动态库

4. 查看动态库
    file libmymath.so
    
    libmymath.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=8e82c257df06f7e69e5b0e2c30d2056f4f13422b, not stripped

5. 启动 程序 ./app ----> 报错:

    - 错误原因:“动态链接器” ld-linux-x86-64.so.2 搜索动态库的路径没有指定。

        - 链接器:工作于 gcc 编译4过程 中的 “链接阶段”。 工作结束,生成 可执行文件。
        - 动态链接器:工作于可执行程序运行之后,辅助加载器负责将动态库加载到内存。

    - 查看错误:**ldd** 可执行文件名

6. 解决上述错误。 —— 基本思想:给 动态链接器 指定 动态库路径。

    1. 环境变量法 。

        - export LD_LIBRARY_PATH=./lib  将当前动态库所在目录,加入到环境变量中。

        - 终端一旦退出,环境变量的修改无效。

        

    2. 配置文件法:

        - 将上述修改环境变量的指令,写入到 ~/.bashrc 中

        - 每次启动终端,自动生效

        

    3. 拷贝法:

        - 受程序使用 libc 库的启发。将自定义的 libmymath.so 文件 拷贝到 /lib 或 /usr/lib 中

        - 为了执行用户自定义程序。需要修改系统配置。

    4. 【推荐使用】缓存文件法:

        1. 通过修改配置文件,修改缓存文件,生成动态连接器需要搜寻的新目录位置。

        2. 打开配置文件:sudo vim /etc/ld.so.conf   

        3. 修改配置文件:将 动态库 的绝对路径添加到  /etc/ld.so.conf 文件中。

        4. 使用 命令 sudo ldconfig -v 动态更新 ld.so.cache 文件(二进制文件)。 该文件直接影响动态连接器搜索动态库位置。

        5. 原理:

        

   


http://www.mrgr.cn/news/82051.html

相关文章:

  • npx和npm和pnpm的异同
  • 深度学习笔记(12)——深度学习概论
  • HarmonyOS NEXT应用开发实战:免费练手的网络API接口分享
  • filebeat采集应用程序日志和多行匹配
  • C语言中的printf、sprintf、snprintf、vsnprintf 函数
  • 696: Soldiers
  • LVS 负载均衡原理 | 配置示例
  • Linux高级--3.2.4.2 常见的几种timer的设计方案
  • Java基本操作笔记
  • 协程原理 函数栈 有栈协程
  • 有限元分析学习——Anasys Workbanch第一阶段笔记(2)应力奇异及位移结果对比、初步了解单元的基本知识
  • 大数据组件(一)快速入门调度组件Airflow
  • 人形机器人全身运动规划相关资料与文章
  • PaddleOCROCR关键信息抽取训练过程
  • 蓝桥杯(Java)(ing)
  • 【网络安全实验室】基础关实战详情
  • 沪深捉妖记(一)探寻妖股的特征
  • 数据结构与算法之动态规划: LeetCode 3105. 最长的严格递增或递减子数组 (Ts版)
  • Nginx - 整合lua 实现对POST请求的参数拦截校验(不使用Openresty)
  • L25.【LeetCode笔记】 三步问题的四种解法(含矩阵精彩解法!)
  • SAP SD信贷管理信用管理手册(下)
  • 通义千问QvQ-72B-Preview模型部署
  • FOC控制原理-ADC采样时机
  • HarmonyOS NEXT应用开发实战:免费练手的网络API接口分享
  • 数据结构与算法之动态规划: LeetCode 1143. 最长公共子序列 (Ts版)
  • 后端开发-Maven