【智能家居】3、Linux库的生成和使用(核心代码是程序员不可公开的小秘密)_linux拷贝文件到 usr lib中(1)

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上运维知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注运维)
img

正文

生成.o文件
gcc -c 文件名.c 

继续使用上一小节工厂模式的代码将cat.c dog.c person.c 生成对应的.o文件

2. 将所有的.o文件归档为一个静态库.a文件

运行ar命令,将所有的.o文件归档为一个静态库文件(ar 指令是一个Unix/Linux系统中的档案管理工具,主要用于管理和处理备存文件(archive))

将.o文件生成.a静态库文件

ar rcs lib+要生成静态库的名字.a *.o 

//lib是library(库)的缩写
//*.o中“ * ”是通配符,表示该文件夹中的所有.o文件
//ar 命令中的 rcs 是 -rcs 参数组合的一个简写形式,分别代表以下几个动作:
    -r:追加档案到归档文件。
    -c:创建归档文件。如果指定的目标文件已经存在,则清空后再进行操作。
    -s:排序归档文件内的成员。
综合起来,-rcs 参数就是追加、清除及排序的意思。这意味着,如果你有一个已经存在的归档文件,你想向里面添加一些新的档案,那么应该使用 -rcs 参数,这样可以确保归档文件中的成员按照正确顺序排列。

成功生成了名为libfactory.a的静态库文件

Linux 静态库的使用

在创建完静态库后,就可以在其他程序中使用它了。

这时我们可以删除(rm)/移动(mv)功能函数以及第一步生成的.o文件,只留下头文件、主函数和生成的静态库

在编译时,只需将库添加到链接器命令中

gcc 文件名.c -L ./ -l静态库名(砍头去尾) -o 可执行文件名字

//砍头去尾是意思是:我们生成静态库名字是 libfactory.a,
使用-l链接的时候只需-lfactory即可,去掉lib和.a

不加-L ./会报错,因为-l链接的库默认在/usr/lib /usr/local/lib下面寻找,加上-L ./后告诉编译器在当前目录下寻找这个库,因为这个静态库是我们自己生成的

运行效果

Linux 动态库:

Linux动态库是一种共享的、可执行的二进制代码块,它在程序运行时被临时装载到内存中,因此它可以被多个进程同时使用,节省了内存资源。动态库的文件扩展名为“.so”,即Shared Object(共享对象)的缩写。

Linux 动态库作用

  1. 节省空间:由于多个程序可以共享一个动态库,因此可以节省磁盘空间和内存。
  2. 改进性能:动态库只在程序真正需要时才被载入内存,这样可以提高系统的整体性能。
  3. 更新灵活:动态库可以单独更新而不必重新编译整个程序。
  4. 提供更强的灵活性:动态库可以随时安装和卸载,无需重新编译程序。

Linux 动态库的创建

在Linux环境中,可以通过以下步骤创建动态库:

生成.so动态库文件
生成.so动态库文件
gcc -shared -fpic 文件名.c -o lib名字.so

//-shared 选项告诉 GCC 在生成目标文件时产生共享库(也就是动态链接库)。这表示你的程序可以动态链接到其他程序中,因此无需在运行时每次都加载整个库文件,而是只加载必要的部分。
//-fpic 是 Position Independent Code 的缩写,意为位置无关代码,它会让 GCC 在编译目标文件时创建一个独立于内存位置的代码,这样就可以在程序运行时改变动态库的内存位置。

Linux 动态库的使用

在创建完动态库后,就可以在其他程序中使用它了。

这时我们可以删除(rm)/移动(mv)功能函数以及第一步生成的.o文件,只留下头文件、主函数和生成的动态库

在编译时,只需将库添加到链接器命令

gcc 文件名.c -L./ -l动态库名(砍头去尾) -o 可执行文件名字

//砍头去尾是意思是:我们生成静态库名字是 libfactory.so,
使用-l链接的时候只需-lfactory即可,去掉lib和.so

不加-L ./会报错,因为-l链接的库默认在/usr/lib /usr/local/lib下面寻找,加上-L ./后告诉编译器在当前目录下寻找这个库,因为这个静态库是我们自己生成的

!!执行出错!!

静态库编译后可以直接运行可执行文件但是动态库不可以:静态库会被编译并包含在程序中,因此当程序运行时,不需要外部依赖(在程序编译前就加入到目标程序中**),而动态库会在运行时临时加载**,(在程序执行时动态地由目标程序去调用,程序执行的时候才去寻找动态库)。

解决办法

1、将生成的动态库拷贝到 /usr/lib 中

删除 /usr/lib 下的动态库方便验证法2

2、通过环境变量LD_LIBRARY_PATH指定动态库搜索路径
export LD_LIBRARY_PATH="生成的动态库所在的文件夹路径"

树莓派中但这个命令是临时的只限于运行这个命令的窗口,换一个窗口就不行了(虚拟机不会)

写一个shell脚本解决这个问题

总结

静态库的优点在于它们不需要在运行时存在,而动态库需要在运行时可用,否则程序将无法启动。但另一方面,静态库会增加最终程序的大小,因为它们的代码被嵌入到了程序中,而动态库则是只在运行时加载,从而减小了程序的大小。此外,静态库比动态库更容易安全审计,因为它们是完全内置到程序中的。 总的来说,静态库适合于那些只需要少量更改并且不需要频繁更新的代码模块,而对于需要经常更新和更改的模块更适合使用动态库

一、Linux 静态库优点:

  1. 可以直接执行。
  2. 不需要考虑其他文件的影响。
  3. 不依赖其他环境。

缺点:

  1. 执行文件较大。
  2. 多个程序共用同一份资源会产生冗余拷贝。
  3. 更新或部署麻烦。

最后的话

最近很多小伙伴找我要Linux学习资料,于是我翻箱倒柜,整理了一些优质资源,涵盖视频、电子书、PPT等共享给大家!

资料预览

给大家整理的视频资料:

给大家整理的电子书资料:

如果本文对你有帮助,欢迎点赞、收藏、转发给朋友,让我有持续创作的动力!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注运维)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注运维)
[外链图片转存中…(img-LbkbXCky-1713468730157)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 15
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值