引文

库文件是计算机上的一类文件,可以理解为一种代码仓库,提供给使用者一些可以直接使用的变量、函数或类。

库文件分为两类:

  • 静态库:在链接阶段,会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中。因此对应的链接方式称为静态链接。
  • 动态库:动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入。不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例,规避了空间浪费问题。

1. 静态库

1.1 静态库的制作

  • 命名规则:

    • Linux:libxxx.a

      • lib: 前缀,固定
      • xxx:库的名称,自起
      • .a: 后缀,固定
    • Windows:libxxx.lib
  • 静态的制作
    • gcc 获得 .o 文件
    • 将 .o 文件打包,使用 ar(archive) 工具

命令:ar rcs libxxx.a xxx.o xxx.o

eg: arc rcs libsuanshu.a sub.o add.o mult.o div.o

1.2 静态库的使用

ydh@ubuntu:~/static_lib$ gcc main.c -o dest -I include/ -l calc -L lib/

​ 解释如下:

​ -I include/:生成目标文件所需头文件路径

​ -l calc:调用的库的名称

​ -L lib/:调用的库的路径

注:调用静态库依旧需要附带头文件,比如上述例子中的静态库calc包含了add.o、sub.o、mult.o、div.o的函数体,但是我们依旧需要头文件 head.h 来告诉我们有哪些函数。

​ head.h 的内容如下:

#ifndef _HEAD_H
#define _HEAD_H// 加法
int add(int a, int b);
// 减法
int subtract(int a, int b);
// 乘法
int multiply(int a, int b);
// 除法
double divide(int a, int b);#endif

2. 动态库

2.1 动态库的制作

  • 命名规则

    • Linux:libxxx.so

      • lib:前缀,固定
      • xxx:库的名称,自定
      • .so :后缀,固定
    • Windows:libxxx.dll
  • 动态库的制作

    • gcc 得到和位置无关的代码

      gcc -c -fpic/-fPIC a.c b.c
      
    • gcc 得到动态库

      gcc -shared a.o b.o -o libcalc.so
      

2.2 动态库的使用

报错原因:动态库是程序运行期间动态加载到程序中的,当找不到依赖的文件时报错

此时,可以通过 ldd(list dynamic dependencies)命令查看动态库依赖关系

2.3 动态库加载失败的解决方法

​既然上述问题是因为无法找到动态(共享)库的位置,那我们如何定位动态库呢?

​当系统加载可执行代码时,能够知道其所依赖的库的名字,但是还需要知道绝对路径。此时就需要系统的动态载入器来获取该绝对路径。对于elf格式的可执行程序,是由ld-linux.so来完成的,它先后搜索elf文件的DT_RPATH段–>环境变量LD_LIBRARY_PATH–>/etc/ld.so.cache文件列表–>/lib/,/usr/lib目录找到库文件后将其载入内存。

  • 方式一:直接在终端进行配置。这种配置方式只在当前终端有效。

    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:动态库路径
    

    注:$ 为取值,:为拼接,上述命令表示将原来的动态库路径加上新的动态库路径

  • 方式二:用户级别的,修改 .bashrc 文件,并重启该文件配置

    vim .bashrc     // 在文件的最后一行加上方式一的配置语句并退出(ESC + :wq)
    . .bashrc       // 第一个点相当于source,即source bashrc
    
  • 方式三:系统级别,修改 /etc/profile 文件,并重启该文件配置

    vim /etc/profile    // 在文件的最后一行加上方式一的配置语句并退出(ESC + :wq)
    . /etc/profile      // 第一个点相当于source,即source /etc/profile
    

3. 静态库与动态库的区别

  • 静态库优缺点

    • 优点

      • 静态库被打包到应用程序中加载速度快
      • 发布程序无需提供静态库,移植方便
    • 缺点
      • 消耗系统资源、浪费内存
      • 更新、部署、发布麻烦
  • 动态库优缺点

    • 优点

      • 可以实现进程间资源共享
      • 更新、部署、发布简单
      • 可以控制何时加载动态库
    • 缺点
      • 加载速度比静态库慢
      • 发布时需要提供依赖的动态库

说明: 参考视频https://www.nowcoder.com/study/live/504

静态库和动态库的使用与区别相关推荐

  1. 关于Linux静态库和动态库的分析

    From: http://hi.baidu.com/bdccutysj/blog/item/5bae7f0202abac7c3912bb15.html 1.什么是库 在windows平台和linux平 ...

  2. C/C++ 静态库和动态库的区别

    可执行目标文件 可重定位目标文件 共享目标文件 静态库和动态库的区别: 生效阶段不同,静态库是在编译阶段就会把其链接到可执行目标文件中:动态库是在程序运行过程中指定路径或者系统动态库路径下寻找. -l ...

  3. 静态库与动态库详细剖析

    技术交流QQ群:1027579432,欢迎你的加入! 1.库的介绍 库是什么? 二进制文件: 将源代码(.c或.cpp文件)变成二进制格式的源代码: 加密操作(只能使用,无法知道源代码是什么): 库制 ...

  4. linux 中如何将文件粘贴到usr下的lib内,学会在Linux下GCC生成和使用静态库和动态库...

    一.基本概念1.1什么是库 在windows平台和linux平台下都大量存在着库. 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 由于windows和linux的平台不同(主 ...

  5. C 语言编程 — 静态库、动态库和共享库

    目录 文章目录 目录 文章目录 程序函数库 静态链接 创建静态库文件 动态链接 创建共享库文件 共享库文件的名字 共享库文件的存储路径 LD_LIBRARY_PATH 环境变量 ldconfig 指令 ...

  6. NDK 编译和使用静态库、动态库

    NDK 编译和使用静态库.动态库 情况一:编译静态库 情况二:编译动态库 情况三:编译动态库+静态库 情况四:已有第三方静态库(动态库),编译静态库(动态库) 默认所有代码和文件在$project/j ...

  7. Linux中gcc的编译、静态库和动态库的制作

    欢迎大家关注笔者,你的关注是我持续更博的最大动力 Linux中gcc的编译.静态库.动态库 文章目录: 1 gcc的编译过程 1.1 gcc的编译过程 1.2 gcc的常用参数 2 gcc 静态库的制 ...

  8. Head First C 第八章 静态库与动态库 创建动态库

    2019独角兽企业重金招聘Python工程师标准>>> Head First C 第八章 静态库与动态库 创建动态库 动态库是什么 静态库文件,需要在链接过程中和主程序链接在一起,如 ...

  9. Linux下的静态库、动态库和动态加载库

    from: http://www.techug.com/linux-static-lib-dynamic-lib 库的存在极大的提高了C/C++程序的复用性,但是库对于初学者来说有些难以驾驭,本文从L ...

  10. 【Android NDK 开发】Android.mk 配置静态库 ( Android Studio 配置静态库 | 配置动态库与静态库区别 | 动态库与静态库打包对比 )

    文章目录 I . Android Studio 中使用 Android.mk 配置静态库 总结 II . 第三方动态库来源 III . 配置 Android.mk 构建脚本路径 IV . 预编译 第三 ...

最新文章

  1. ACMNO.27 Python的两行代码解决 C语言-字符逆序 写一函数。使输入的一个字符串按反序存放,在主函数中输入输出反序后的字符串。 输入 一行字符 输出 逆序后的字符串
  2. keil编写正弦函数_【高中数学】62个重要函数图像
  3. 一个完整的DS1302时钟在STM32上的应用实例
  4. 一场开发与视觉的对话引发的思考
  5. ByteArrayOutputStream和ByteArrayInputStream详解
  6. 去除覆盖在文字上的水印_PDF文档密码移除与文字水印去除工具
  7. halcon使用点拟合圆形时候,点集顺序紊乱,不影响圆形拟合效果
  8. SpringBoot整合阿里云OSS文件上传、下载、查看、删除
  9. 各纬度气候分布图_地理:世界各种气候类型分布图(高清版)汇总!以及解答分析哦~...
  10. mysql升级准备工作
  11. Java Generics示例教程 - 通用方法,类,接口
  12. Linux系统基础(二)
  13. Failed to find any matching files for /tmp/resnet_v1_50.ckpt
  14. 隐藏Tabview顶部上的空白区域统一去掉图片名后缀
  15. [转载]Deep Learning·NLP·Representation
  16. matlab提取汉字拼音,中文转拼音工具
  17. Django学习 day61之Django第七日
  18. 什么是迁移学习?什么时候使用迁移学习?
  19. 菌群数据预处理-microbiome包
  20. 计算机工程+cssci,XC中文学术期刊等级分类目录

热门文章

  1. IDEA导入maven聚合项目
  2. java注释 神兽,代码注释,神兽护体,代码无bug
  3. 二分图匹配-匈牙利算法
  4. ros使用遇到的问题与解决方案
  5. 阿里云没有“引路人”
  6. 笔记本电脑显示计算机无法启动,笔记本电脑未能启动怎么回事_笔记本电脑显示windows未能启动如何解决-win7之家...
  7. android errcode 1,android 唤起支付失败。一直返回errCode=-1
  8. 机器学习之数据分析与特征工程
  9. 电源计划信息服务器,有关如何解决在 Windows 7 中的电源计划
  10. 开启1521端口监听_服务器1521端口被关闭,如何开启