AI资料整理以及,简单地聊下动静态链接库

前言
最近在整理收集一些资料,有关深度学习模型训练、模型部署优化,相关基础知识、编程工具,以及相关AI工作推荐的一些东东,都打算整合到一起,方便大家或者自己查阅。

整合起来的站点,就叫做进击的人工智能吧~

站点使用Material for MkDocs这个框架搭建,这个框架之后老潘会介绍一哈(着急的也可以自行搜索,很适合搭建自己的文档库)。特点是可以随身随地看自己搭建的文档,就和博客一样,但是组织性很好。输入你的文档网址,只要有网就能看。

渴望被填满内容的站点
内容大纲暂定为这些:

理论基础知识预备
深度学习环境配置
模型训练与设计
模型部署与调优
有意思且有深度的AI项目
提升效率的工具
适合:

想成为算法工程师的小伙伴
想学习Pytorch、TensorRT、Caffe的小伙伴
想了解侧端模型部署以及服务器模型部署的小伙伴
想了解AI有趣项目以及应用、探索内部原理的小伙伴
想要面试前补充一些知识的小伙伴
会慢慢更新,文章也会最先同步到公众号,开搞开搞!

正文
啊,扯了那么多…回归正文。

今天简单聊一下编程中常见的.so .o .a .dll .lib .obj文件。

也就是动态链接库和静态链接库,这两个玩意儿在工程中经常用到(尤其前一个),还是有必要复习一下的。

在Linux系统中,.so、.o、.a这些文件,和Windows中的obj、lib、dll、exe等文件的关系是对应的。

先说下windows中的。

windows下obj、lib、dll、exe的关系
exe是我们平常所知道的可执行程序的后缀,而obj、lib、dll则是构成运行程序的关键文件。

lib是和dll对应的。lib是静态链接库的库文件,dll是动态链接库的库文件。

所谓静态就是link的时候把里面需要的东西抽取出来安排到你的exe文件中,以后运行你的exe的时候不再需要lib。所谓动态就是exe运行的时候依赖于dll里面提供的功能,没有这个dll,你的exe无法运行。

lib,dll,exe都算是最终的目标文件,是最终产物。而c/c++属于源代码。源代码和最终目标文件中过渡的就是中间代码obj,实际上之所以需要中间代码,是你不可能一次得到目标文件。比如说一个exe需要很多的cpp文件生成。而编译器一次只能编译一个cpp文件。这样编译器编译好一个cpp以后会将其编译成obj,当所有必须要的cpp都编译成obj以后,再统一link成所需要的exe,应该说缺少任意一个obj都会导致exe的链接失败。

obj里存的是编译后的代码跟数据,并且有名称,所以在连接时有时会出现未解决的外部符号的问题。当连成exe后便不存在名称的概念了,只有地址。lib就是一堆obj的组合。
理论上可以连接obj文件来引用其他工程(可以认为一个obj文件等价于编译生成它的cpp文件,可以引用obj来替换cpp,也可以添加cpp来替换obj ),但实际中通常用lib来实现工程间相互引用。
编译器会默认链接一些常用的库,其它的需要你自己指定。

lib和dll的区别
lib是编译时需要的,dll是运行时需要的。如果要完成源代码的编译,有lib就够了。如果也使动态连接的程序运行起来,有dll就够了。在开发和调试阶段,当然最好都有。

一般的动态库程序有lib文件和dll文件。lib文件是必须在编译期就连接到应用程序中的,而dll文件是运行期才会被调用的。如果有dll文件,那么对应的lib文件一般是一些索引信息,具体的实现在dll文件中。如果只有lib文件,那么这个lib文件是静态编译出来的,索引和实现都在其中。

静态编译的lib文件有好处:给用户安装时就不需要再挂动态库了。但也有缺点,就是导致应用程序比较大,而且失去了动态库的灵活性,在版本升级时,同时要发布新的应用程序才行。

在动态库的情况下,有两个文件,一个是引入库.LIB文件(实际上也算是一个静态库,只是在链接时只能把函数在dll的入口链接到exe中,而不像真正静态链接库那样将函数体真正链接到exe中 ,通过lib进行的动态链接实际上也使用了静态链接来实现),一个是dll文件,引入库文件包含被dll导出的函数的名称和位置,dll包含实际的函数和数据,应用程序使用LIB文件链接到所需要使用的dll文件,库中的函数和数据并不复制到可执行文件中,因此在应用程序的可执行文件中,存放的不是被调用的函数代码,而是dll中所要调用的函数的内存地址,这样当一个或多个应用程序运行是再把程序代码和被调用的函数代码链接起来,从而节省了内存资源。从上面的说明可以看出,dll和.LIB文件必须随应用程序一起发行,否则应用程序将会产生错误。

dll内的函数分为两种:

dll导出函数,可供应用程序调用;
dll内部函数,只能在dll程序使用,应用程序无法调用它们
linux下 .o、.a、.so文件的区别
.o是目标文件,相当于windows中的.obj文件

.so为共享库,就是动态链接库,共享共享么,就是可以被多个程序所链接所使用。相当于windows下的dll

.a为静态库,说白了就是一堆.o合在一起的包含代码和数据的文件,用于静态连接,效果和.o是一样的

动态链接库和静态链接库的区别
简单聊下动态库和静态库的区别:

动态链接库
共享函数库在可执行程序启动的时候加载,所有程序重新运行时都可自动加载共享函数库中的函数。相对于静态函数库,共享函数库在编译的时候 并没有被编译进目标代码中
当程序执行到相关函数时才调用共享函数库里相应的函数,因此共享函数库所产生的可执行文件比较小.由于共享函数库没有被整合进你的程序,而是在程序运行时动态地申请并调用,所以程序的运行环境中必须提供相应的库
共享函数库的改变并不影响你的程序,所以共享函数库的升级比较方便
静态链接库
实际上是简单的普通目标文件的集合,在程序执行前就加入到目标程序中
这类库的名字一般是libxxx.a.利用静态函数库编译成的文件比较大,因为整个函数库的所有数据都会被整合进目标代码中
如果静态函数库改变了,那么你的程序必须重新编译
后记
动态链接库和静态库是工程项目中的常客,本文先简单聊一下,之后关于这两个玩意儿的讨论只会多不会少(立flag)~

如果想系统了解关于链接库的一些知识,老潘还是推荐《深入理解计算机原理》这本书,不废话,多看看不管做项目还是面试都是极好的。

书籍资源回复”666″即可获取。

往期回顾
Mac mini m1使用简单体验(编程、游戏、深度学习)
各种姿势的debug(从python一路debug到C++)
实现TensorRT自定义插件(plugin)自由!
又到招聘季,聊一聊今年的算法工程师,以及老潘的面经
主机回来以及,简单的环境配置(RTX3070+CUDA11.1+CUDNN+TensorRT)

关注“oldpan博客”,持续酝酿深度质量文
我是老潘,我们下期见~

声明:文中观点不代表本站立场。本文传送门:https://eyangzhen.com/202705.html

(0)
联系我们
联系我们
分享本页
返回顶部