cmake(二十六)库的杂谈

说明: 本篇章是为了更高的理解'头文件、库文件、lib库'之间的联系,'辅助'理解'cmake'相关的指令

一   

①    什么是库

前提: 在windows平台和linux平台下都存在着'大量'的库

库是写好的现有的、'成熟的'、可以'复用'的代码

备注: 现实中每个程序都要依赖很多'基础的底层库',不可能每个人的代码都'从零开始',因此'库的存在意义'非同寻常

1)库'library'是函数库的'简称'

2)每个库都有'至少一个'的'头文件(.h文件)'和一个'库文件(二进制)'

理解: 头文件可能'引用'其它头文件,所以一个库文件'关联'不止一个头文件

3)库文件中是目标代码状态的函数,而通过'头文件',我们能够知道'某个库'中有'哪些函数',按照怎样的方式才能'使用'它们

4)本质上来说库是一种'可执行代码'的'二进制形式',可以被操作系统'载入内存'执行

②    库的种类


库按'使用方式'分两种:动态库('dynamic')和静态库('static')

注意: 库在'windows'和'linux'的命名规范

备注: cmake编译后'默认'的库都是以'lib'为'前缀'的

1)静态库

1)Windows中静态库以'.lib'为后缀的文件

备注: Windows上发布的软件'常常'是以静态编译(即编译时包括静态库)的方式发布的,而'大型软件'则以'动态编译加动态库'的方式发布(可以有效'减少软件'的大小)

2)Linux中静态库是以 '.a' 为后缀的文件

3)Mac中静态库是以'.a'为后缀的文件

备注: 以.framework为'后缀的文件'可能是'静态'库,也可能是'动态'库

2)动态库

1)Windows下的动态库叫'DLL'的文件

备注: DLL是Dynamic link Library'动态链接库'的缩写

2)Linux上,动态库通常是用'.so结尾'的

3)Mac中动态库是以'.dylib'为后缀的文件

备注: nginx中通过'rpm'可以安装部分'动态库',一些'静态库'值能在'初始化'安装的时候进行安装

3)动态库和静态库的区别

静态库和'应用周期是'紧耦合的,'换句话'和该版本的'应用程序'是强相关的,应用'周期同步'

优点1: '运行效率'稍高

缺点2: 占用'内存资源'太多

缺点3: 静态库是它的'程序'的组成部分,程序'比较大'

1)动态库'不是'使用它的程序的组成部分,有效的'减少'程序的大小

2)程序'运行时'必须"动态地"调用'动态库'中的函数,则该动态库一定要在系统'可以找的到'的地方

1)静态库的优点在于'直接被链接'进可执行程序中,之后该可执行程序就'不再依赖于运行环境'的设置了

备注: 仍然会依赖于 'CPU指令集'和'操作系统支持'的可执行文件格式等'硬性'限制

2)动态库的优点在于,用户甚至可以在程序运行时随时替换该动态库,这就构成了'动态插件'系统的基础-->'松耦合'

③    库存在的意义

1)库是'别人写好'的'现有的'、'成熟的'、可以'复用'的代码,你可以使用但要记得遵守'许可协议'

思考: 有哪些'常见'的许可协议?

2)现实中每个程序都要'依赖'很多'基础的底层库',不可能每个人的代码都'从零开始',因此库的存在意义非同寻常

3)共享库'SHARED'的好处是,'不同的应用程序'如果调用'相同'的库,那么在'内存里'只需要有一份该'共享'库的实例

④    库文件linux下如何生成

(1)  静态库的'后缀是.a',它的产生'分两步'

  Step 1:由源文件编译生成'一堆.o',每个.o里都包含这个'编译单元的符号表';

  Step 2:ar命令将很多.o,'转换成'.a,成为'静态库';

(1)  动态库的'后缀是.so',它由'gcc'加'特定参数'编译产生

    gcc -fPIC -c *.c 

备注1: -fPIC 是'编译'选项,创建与'地址无关'的编译程序(pic,position independent code),是为了能够在'多个应用程序间共享'

备注2: -c -->'compile',将代码'编译'为'二进制'的机器指令

效果: 生成一堆'.o'文件

    gcc -shared -Wl,-soname, libfoo.so.1 -o libfoo.so.1.0 *

备注1: -shared指定生成'动态链接库'

备注2: -Wl 实际编译的时候有'可能'是包含'静态库'和'动态库'两种情况,这时候就是'应用Wl'的时候

备注3: -o 指定文件'输出名字'

强调: 与创建'动态库'不需要‘打包‘工具(ar、lib.exe),直接'使用编译器'即可创建动态库

gcc Wl参数含义

动态链接和静态链接

'Wl选项'告诉编译器'将后面的参数'传递给链接器;'-soname'则指定了动态库的soname

linux下动态库soname简介

⑤    库文件命名规范

+++++++++++Linux中'库文件'的位置+++++++++++

1) /lib64是'内核'级的

2)/usr/lib64是'系统'级的

3)/usr/local/lib64是'用户级'的

备注: 加'64'表明是64位的系统,不加'32'位,一般都会做'软链接'进行'兼容'

4)/usr/libexec 目录下存放一些'函数库'、'执行文件'、'连接文件'

++++++++++++++'cmake中的命名规范'++++++++++++++

1)'静态库'的名字一般为libxxxx.a其中xxxx是该'lib的名称'

2)'动态库'的名字一般为libxxxx.so.major.minor,xxxx是'该lib的名称',major是'主版本号',minor是'次版本号'

备注: linux中以'.so'、'.a'结尾

⑥    查看一个可执行程序依赖哪些库

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

linux下可执行程序如何定位共享库文件以及如何让系统找到用户指定的库

⑧     新安装一个库之后如何让系统能够找到

ll /etc/ld.so.conf.d/   -->'推荐'放到该目录下

对于一个新安装到系统中的库,有时需要执行ldconfig命令,来自动完成动态库的更新

⑨    常见的报错

场景: 缺少相关的'依赖库',后续'贴图',一般是软件安装'缺少依赖'造成的

解决策略

1) 'provides'或'whatprovides'尝试是否能找到

yum whatprovides + 指令,来查看是'哪一个软件包'提供了这样要给指令

yum whatprovides + 文件,来查看是'哪一个软件包'提供的这样的文件

备注: 一般用'*/something'来代替

参考博客

二     参考博客

c头文件和库函数的区别

c++头文件与库文件的区别

百度参考

动态链接库查找过程

Hello World背后的故事

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值