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

一、什么是库

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

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

二、库的种类

库有两种:静态库和动态库。
所谓静态、动态是指链接。回顾一下,将一个程序编译成可执行程序的步骤:
链接: 把外部函数的代码(通常是后缀名为.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 -laddsub

collect2: 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

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

郑同学的笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值