【Cmake实战:番外】库、动态库和静态库(.dll,.so,.lib,.a)

  • 一、什么是库
  • 二、库的种类
  • 三、命名方式
  • 四、动态库和静态库的特点
  • 五、如何知道一个可执行程序依赖哪些库
  • 六、linux创建静态库和动态库的过程
  • 七、如何使用库
  • 八、如何使用静态库
  • 九、如何使用动态库

一、什么是库

库是写好的现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。

本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。
外部函数不进入安装包,只在运行时动态引用。

二、库的种类

库有两种:静态库和动态库。
所谓静态、动态是指链接。回顾一下,将一个程序编译成可执行程序的步骤:
链接: 把外部函数的代码(通常是后缀名为.lib和.a的文件),添加到可执行文件中。这就叫做连接(linking)。这种通过拷贝,将外部函数库添加到可执行文件的方式,叫做静态连接(static linking),还有动态连接(dynamic linking)

三、命名方式

linux下:
静态库:lib库名.a
动态库:lib库名.so(shared object)

window:下
静态库:lib库名.lib
动态库:lib库名.dll(dynamic link library)

区分一个概念:库是包含前缀lib以及后缀.a或者.so的一个整体

库名是去掉前缀和后缀剩下的部分

四、动态库和静态库的特点

静态库的特点:
1、使用静态库的时候,会将静态库的信息直接编译到可执行文件中
2、优点:当静态库被删除,对可执行文件没有影响
3、缺点:浪费内存空间。如果静态库被修改,可执行程序要重新编译

动态库的特点:
加载器在加载动态库时,操作系统会先检查动态库是否因为其它程序已经将这个动态库信息加载到了内存中。如果没有加载到内存中,操作系统会将动态库载入内存,并将它的引用计数设置为1;如果已经加载到内存,仅将动态库的引用计数加1。

五、如何知道一个可执行程序依赖哪些库

ldd命令可以查看一个可执行程序依赖的共享库

例如# ldd + 路径/可执行程序

六、linux创建静态库和动态库的过程

静态库:

a、创建.o文件
b、ar -cr lib库名.a *.o

动态库:

a、创建.o文件 要使用-fpic选项

“-fpic”告诉GCC产生的代码不要包含对函数和变量具体内存位置的引用,这是因为现在还无法知道使用该代码的应用程序会将它连接到哪一段内存地址空间。这样编译出的hello.o可以被用于建立共享链接库。

b、 gcc -shared -o lib库名.so *.o

七、如何使用库

静态库:

a、如果静态库放在系统目录/lib或者/usr/lib下

执行方式为 gcc main.c -l库名

b、如果静态库没有放在系统目录下则执行方式为执行 gcc main.c -L 静态库路径 -l 库名。或者执行gcc main.c 路径/整个静态库

动态库:

a、如果放在系统目录下执行方式为 gcc main.c -l库名b、如果没有放在系统目录下执行方式分为两种:

第一种:执行 gcc main.c -L 动态库路径 -l 库名,不过这种方式在执行可执行程序的时候可能出现如下错误

./a.out: error while loading shared libraries: libadd.so: cannot open shared object file: No such file or directory

解决方式:

1、在/etc/bash.bashrc文件中添加export LD_LIBRARY_PATH=$LD_LRBRARY_PATH:动态库的绝对路径。后source /etc/bash.bashrc

2、在/etc/ld.so.conf.d目录下创建一个以.conf为后缀的文件,在这个文件中添加上动态库的绝对路径,后执行sudo ldconfig

ldconfig命令的用途,主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库.

第二种:如果第一种的方式都配置完之后出现如下错误

/usr/bin/ld: cannot find -laddsubcollect2: ld returned 1 exit status

这种错误说明编译器找不到需要链接的库,则执行gcc main.c 动态库路径/动态库

八、如何使用静态库

请参考我的另外一篇博客
【cmake实战五】如何使用编译的库(静态库)——windows系统

九、如何使用动态库

请参考我的另外一篇博客
【cmake实战六】如何使用编译的库(动态库dll)——windows系统

参考:
1、动态库和静态库的区别http://emb.hqyj.com/Column/4173.html
2、编译器的工作过程http://www.ruanyifeng.com/blog/2014/11/compiler.html
3、Linux共享库、静态库、动态库详解https://www.cnblogs.com/sunsky303/p/7731911.html
4、linux中的动态链接库https://blog.csdn.net/qq_33113661/article/details/88991909
5、C++静态库与动态库的区别?https://blog.csdn.net/dd_hello/article/details/81782934
6、Linux中的动态库和静态库(.a.la.so.o)https://blog.csdn.net/qq_33706673/article/details/80035190

【Cmake实战:番外】库、动态库和静态库(.dll,.so,.lib,.a)相关推荐

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

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

  2. 【Android 安装包优化】使用 lib7zr.a 静态库处理压缩文件 ( 交叉编译 lib7zr.a 静态库 | 安卓工程导入静态库 | 配置 CMakeLists.txt 构建脚本 )

    文章目录 一.修改 7zr 交叉编译脚本 Android.mk 二.完整的 7zr 交叉编译脚本 Android.mk 三.交叉编译 lib7zr.a 静态库 四.Android Studio 导入 ...

  3. iOS开发中静态库制作 之.a静态库制作及使用篇

    iOS开发中静态库之".a静态库"的制作及使用篇 一.库的简介 1.什么是库? 库是程序代码的集合,是共享程序代码的一种方式 2.库的类型? 根据源代码的公开情况,库可以分为2种类 ...

  4. 【Linux篇】第十一篇——动静态库(动静态库的介绍+动静态库的打包与使用)

    动静态库的基本原理 认识动静态库 动静态库的概念 静态库的打包与使用 静态库的打包 静态库的使用 动态库的打包与使用 动态库的打包 动态库的使用 动静态库的基本原理 动静态库的本质就是可执行程序的&q ...

  5. ios 静态库合成_iOS生成静态库方法-iOS集成静态库-iOS合并静态库

    在iOS的开发过程中,我们常常用到第三方的库.尤其是QQ.百度地图.广告等. 那么,如何制作自己的库文件呢? 如果,将自己写的功能类编译成库文件,分发给其他人来使用呢? 静态库的优点 编译静态库的好处 ...

  6. 6.关于QT中的内存管理,动态的制作,动态库的调用,静态库的制作

     一  QT的内存管理 1  QT中的内存管理是QObject来管理的 2  QT中的内存管理没有cocos2dx中的引用计数 3  组件可以指定父对象 QTimer *timer = QTime ...

  7. 静态编译,动态编译,静态库,动态库的区别

    from :http://blog.csdn.net/ithzhang/article/details/20160009 周五晚,小雨,少见的未加班.无聊,遂准备写一篇博客,介绍一下C和C++运行库, ...

  8. 白话机器学习算法理论+实战番外篇之LightGBM

    1. 写在前面 如果想从事数据挖掘或者机器学习的工作,掌握常用的机器学习算法是非常有必要的,在这简单的先捋一捋, 常见的机器学习算法: 监督学习算法:逻辑回归,线性回归,决策树,朴素贝叶斯,K近邻,支 ...

  9. linux静态库添加文件,Linux静态库和动态库的编写和使用

    Linux静态库和动态库的编写和使用 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种. 1  静态库和动态库的区别 1.1. 静态函数库 (1)静态函数库的名 ...

  10. linux opencv编译静态库,使用openCV的静态库编译

    转载请注明出处: By 少侠阿朱 摘要: 本文主要讲述如何使用opencv静态库进行编译,生成脱离opencv环境可执行.exe文件. 实现的效果: 此方法生成的exe文件在其他没有配置openCV环 ...

最新文章

  1. oracle 加号和on,Oracle中连接与加号(+)的使用
  2. 配置交换机端口聚合(思科)
  3. C语言/C++中怎么表示8进制数或者16进制数?(8进制数用数字0开头,16进制数用0x或者0X开头)
  4. 数据中心业务价值永续的密码——施耐德电气全生命周期服务
  5. linux_unix编程手册-信号概述signal函数
  6. python绘制滑稽脸_用Python画滑稽
  7. #0 scrapy爬虫学习中遇到的坑记录
  8. HTML5中volume样式自定义,html5中关于volume属性的使用详解
  9. python redis 消息队列_Python的Flask框架应用调用Redis队列数据的方法
  10. pytorch torchtext
  11. scala java抽象理解_scala – 抽象覆盖如何在Java代码方面起作用?
  12. 虚拟ip(VIP)实现原理
  13. PSCAD学习笔记(一)
  14. 95后公务员晒3004元工资引群嘲:安逸过了头,人生也就止步了
  15. ffmpeg解析出的视频参数PAR,DAR,SAR的意义
  16. 【Python基础】初识-与君初相识,犹如故人归
  17. 矩阵 通俗_。通俗诗歌
  18. 阿里云视频点播解密DecryptKMSDataKeyRequest爬坑
  19. 和差角证明托勒密定理
  20. Unity3D 集成 高德地图SDK 地图

热门文章

  1. LintCode 597.具有最大平均数的子树
  2. ROS装乐视奥比中光(astra pro)摄像头
  3. 【电力电子技术】Unit 2 电力电子器件
  4. 【心理学】人类误判心理学
  5. 东北大学5月校赛c题
  6. UniSwap V3协议浅析(上)
  7. 【渝粤教育】国家开放大学2018年春季 8644-21T汽车电子商务 参考试题
  8. 线路板入行必读:PCB电路板小常识
  9. 总结组合数的几种求法(模板)
  10. 关于产品的一些思考——新浪之爱问资料和爱问知识人