库 [2] —— 概念说明以及静态库、动态库的生成和使用(多图,手机慎入)

原创首发于CSDN平台,文章转载请注明出处,加上原文链接,谢谢!
https://blog.csdn.net/weixin_46959681/article/details/114970912



Linux系统的库是什么?

不论是在 Mac OS 系统中,还是在 Linux 系统中,库一组是按照可重复使用原则预先编译好的一组二进制代码文件。库文件不可以被独立执行,它可以被操作系统加载入内存中执行。程序函数库可以使整个程序更加模块化,易于重新编译,而且方便升级。

程序函数可以分为: 静态函数库(Static libraries)、动态加载函数库(dynamically loaded libraries)

在 Linux 系统中,标准的库文件一般存放在 /usr/lib的目录中。在终端执行命令 ls /usr/lib ,可以看到一大堆库文件。

在这里插入图片描述

注 意 : 注意: 因为操作系统在编译器、汇编器以及连接器的不同,所以不同系统的库在二进制编译方面是不兼容的。


静态库(Static libraries)

静态库 在程序执行(编译)之前就已经被打包进应用程序中加载速度非常快,它不需要额外的编译减少了内存、CPU的运行支出。缺点在于每一次链接时都要完整地拷贝进可执行的程序文件中,故多次使用就有多份冗余的拷贝文件,在程序的更新、部署以及发布方面造成一定的麻烦。

|静态库的生成和使用

  1. 编译模块代码文件生成静态库原材料文件 calcufuncs.o

在这里插入图片描述

  1. 将原材料文件打包成静态库文件libcalcufunc.a

在这里插入图片描述

  1. 将静态库文件和主函数文件一起打包成“集体文件——mainProStatic

-L ./ 表示从当前路径寻找静态库。

在这里插入图片描述

  1. 运行

在这里插入图片描述

整个过程中文件名的输入一定要特别注意,笔者把文件后缀名输错,找原因找了接近半小时。


动态库(dynamically loaded libraries)

动态库在程序执行过程中动态(临时)的经由目标函数调用。(在 Linux 中文件后缀为 .so,在 Windows 中文件后缀为 .dill 。)

动态的优缺点与静态库正好相反。程序执行中系统动态加载到内存,供程序调用,系统只需要加载一次多个程序同时共享,程序优化升级简单。缺点在于加载速度比静态库慢,程序的发布需要依赖动态库。

|动态库的生成和使用

  1. 编译模块代码文件 直 接 生 成 动 态 库 文 件 \red{直接生成动态库文件} libcalc.so

在这里插入图片描述

  1. 将动态库文件和主函数文件一起打包成“集体文件——mainProDy

在这里插入图片描述

  1. 运行

在这里插入图片描述

注 意 : 注意: 直接运行动态库文件提示错误,系统会提示: ./mainProDy: error while loading shared libraries: libcalc.so: cannot open shared object file: No such file or directory。这个错误关系到 静态库 和 动态库 两个根本性质的不同,上文也将优缺点叙述过了。

在脚本 start.sh 中设置环境变量后设置权限(chmod),运行脚本。

/* start.sh */
export LD_LIBRARY_PATH="/home/jack/Demo2"

./mainProDy

对于Linux 系统库和脚本文件的思索

  • 库 \red{库} 。在动态库一节中,笔者使用了常见的shell脚本方法运行了动态库,这也是多数开发人员日常使用的方式。极端一点的做法是修改 config 文件里的配置和将生成动态库文件直接移动到系统本地的库文件夹内,这几种做法都可以成功执行库文件。但在工作开发环境中是基本不可能给开发者接触到本地库文件夹的权限,另一种移动文件的方式更是会造成系统文件的凌乱。(在笔者个人使用的 Linux 系统中甚至看到了 Python 2.7 版本的老库,个人在考虑是不是要将其删除。)

  • s h e l l \red{shell} shell。对于“脚本”一词笔者以前只有个模糊的概念,在《树莓派开始,玩转Linux》第5节章 —— 贝壳里的树莓派 里有一句:“ 在 Linux 中,所谓的 shell ,就是运行在终端中的文本互动程序。shell 分析文本输入,然后吧文本转换成相应的计算机动作。 ” 个人使用脚本的过程中莫名产生些感觉。在学习教程里陈立臣老师提到 shell 脚本能执行多个多次命令行,这在本质上是更高效的自动化。脚本的背后或许隐藏了目前笔者感觉不到的更高级的威力,目前搜到了几本脚本书籍,这个系列内容学习完毕可以读一读、实践操作下。


shell 书籍阅读参考列表

  • 《Linux shell 核心编程》
  • 《bash shell 脚本编程经典实例》
  • 《Bash Cookbook》(中文版)
  • 《Linux shell 脚本攻略》
  • 《Linux 命令行与 shell 脚本编程大全》

疑惑

  • 程序执行时库是如何被加载的?

参考资料


文章更新记录

  • “Linux系统的库是什么?”完成。 「2021.3.18 17:23」
  • “静态库”完成。「2021.3.20 12:22」
  • “动态库”完成。 「2021.3.20 16:20」
  • 文本首次竣工。 「2021.3.20 16:51」
  • 修改了错别字。 「2021.3.20 17:00」
  • 增加“shell 书籍阅读参考列表”一节。 「2021.4.3 11:20」

P.S. 我个人的学习方式或许该调整一下,不应该在博客端耗费这么多时间,应该压缩一下。(2021.3.20 16:52)

猜你喜欢

转载自blog.csdn.net/weixin_46959681/article/details/114970912