七.树莓派4B-静态库和动态库

库的简介:

库的分类:静态库和动态库,是模块化编程的一种文件类型,文件内部主要存储某个函数功能具体实现的算法代码,头文件则是对这些函数进行声明。
使用库的目的:如果他人想要使用你写的函数功能,那么你就需要将自己所写的函数模块文件给他,而你只想提供函数的使用权限,不提供文件的读写权限,就需要把功能函数文件生成静态或动态库,不仅如此,库还能够影响执行程序的大小。
总而言之,将功能函数文件(***.c)编译成库文件,实现了算法的保密和执行程序的大小,所谓执行程序的大小,比如微信应用程序的大小很大一部分取决于连接的是静态库还是动态库。
例如:


静态库:

库文件标准格式:lib****.a
使用方法:与主程序一起编译,注意要向gcc编译器指明库所在的路径,如:

//若有这三个文件:main.c calculateFun.c calculateFun.h
//main.c是主程序,是实现整个项目的窗口
//calculateFun.c是模块化文件,将加、减、乘、除四则运算的功能实现
//calculateFun.h是头文件,将四种运算函数进行声明
//说明1:主程序若要使用模块化文件里的函数,必须先对函数进行声明,所以应该先#include "calculateFun.h"头文件
//说明2:头文件名可以和模块化文件名一样,也可以不一样,只要内部是对模块化文件里的函数进行声明就行
//说明3:若只提供四则运算函数的使用权限,不提供读写四则运算实现的算法的权限,且使得可执行程序运行时速度更快,则应将模块化文件编译成静态库文件,库文件可以打开,但都是以乱码形式显示,确保了算法的保密性。
//静态库的具体实现方法:
1.gcc calculateFun.c -c		//编译成.o保密文件
2.ar rcs libcalculateFun.a calculateFun.o	//生产库文件标准命名的静态库文件
3.gcc main.c -lcalculateFun -L ./ -o calculate		//与主程序一起编译成calculate可执行程序
4../calculate		//是可以直接执行程序的

总结:

  1. 模块化c文件不具备保密性,需要编译成保密高的.o文件
  2. 再由.o文件生成静态库文件
  3. 静态文件除了具有保密性外,其它的跟模块化c文件差不多,gcc对主程序编译时,会连静态文件或模块化文件一起编译并且写入同一个执行程序中
  4. 生成的可执行程序可以摆脱静态库或模块化文件的束缚,可以单独运行,这是由于gcc在编译主程序时,已经将函数实现代码编译并写入可执行文件当中,所以会使得运算程序更加方便和高效率,但会增大执行程序的文件大小。
  5. 使用的是静态库或模块化文件,是不利于更改,倘若后续有对函数进行调整的需要,那么只能重新编译整个执行程序,这就会产生很大的影响,举个例子:如果微信某个功能使用的是静态库或模块化文件,微信官方后续需要对这个功能作升级,此时官方只能重新编译生成新的微信程序,用户就要删除原先的微信,重新下载,若微信文件比较大,每次这样的更新就会导致大量时间消耗在下载方面。

动态库:

库文件标准格式:lib****.so
使用方法:与主程序一起编译,注意要向gcc编译器指明库所在的路径,如:

//若有这三个文件:main.c calculateFun.c calculateFun.h
//main.c是主程序,是实现整个项目的窗口
//calculateFun.c是模块化文件,将加、减、乘、除四则运算的功能实现
//calculateFun.h是头文件,将四种运算函数进行声明
//说明1:主程序若要使用模块化文件里的函数,必须先对函数进行声明,所以应该先#include "calculateFun.h"头文件
//说明2:头文件名可以和模块化文件名一样,也可以不一样,只要内部是对模块化文件里的函数进行声明就行
//说明3:若只提供四则运算函数的使用权限,不提供读写四则运算实现的算法的权限,且使得可执行程序占用空间小,则应将模块化文件编译成动态文件,库文件可以打开,但都是以乱码形式显示,确保了算法的保密性。
//动态库的具体实现方法:
1.gcc -shared -fpic calculateFun.c -o libcalculateFun.so	//编译生成动态库文件
3.gcc main.c -lcalculateFun -L ./ -o calculate		//与主程序一起编译成calculate可执行程序
4.export LD_LIBRARY_PATH="动态库的具体路径"		//Linux下可以在系统环境变量中为LD_LIBRARY_PATH指定一个路径,在原来基础上增加一个程序执行时寻找动态库的路径,Windows也是需要一个动态库路径,原理差不多
5../calculate		//必须执行第4步后,才能执行程序

总结:

  1. 模块化c文件不具备保密性,需要编译成保密高的.so动态库文件
  2. 动态文件除了具有保密性外,与主程序一起编译时的工作方式是与静态库或模块化文件有着明显区别的,gcc对主程序编译时,只会提取关于动态文件的一些描述信息与主程序一起编译并且写入同一个执行程序中,但动态文件里的函数实现算法并不会被编译写入执行文件内。
  3. 这种方式有效减低可执行程序对存储空间的要求,方便用户的下载,同时若后续有对每个功能进行调整时,也不用卸载整个应用程序,只需要更新相关的动态库文件即可,方便了软件的更新。
  4. 使用动态库,也有着明显的缺陷,程序在执行过程中的效率也会下降,这是因为执行程序内部并没有函数实现的算法,所以当程序执行某个功能时,就需要去寻找相关的动态库文件,并且进行临时编译。那么程序如何寻找动态库文件、去哪里寻找,也是我们在执行程序时要考虑的问题。

说明:
1. -L是为gcc指一个寻找库的路径,默认会从usr/lib或usr/local/lib下
参考博文:https://blog.csdn.net/weixin_52668204/article/details/118224428

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
树莓4B的内核开发可以按照以下步骤进行: 1. 首先,下载内核源码。可以使用以下命令克隆树莓的Linux内核源码: ``` git clone --depth=1 https://github.com/raspberrypi/linux --branch rpi-5.4.y ``` 这将下载最新的树莓Linux内核源码。 2. 安装所需的依赖项。使用以下命令安装所需的软件包: ``` sudo apt install raspberrypi-kernel-headers sudo apt install git bc bison flex libssl-dev make ``` 这将安装所需的内核头文件和其他开发工具。 3. 进入内核源码目录并进行配置。使用以下命令进入内核源码目录: ``` cd linux ``` 然后,使用以下命令配置内核: ``` KERNEL=kernel7l make bcm2711_defconfig ``` 这将使用默认配置文件进行内核配置。 4. 编译内核并安装。使用以下命令编译内核和模块: ``` make -j4 zImage modules dtbs ``` 然后,使用以下命令安装内核模块: ``` sudo make modules_install ``` 接下来,将设备树二进制文件复制到/boot/目录: ``` sudo cp arch/arm/boot/dts/*.dtb /boot/ sudo cp arch/arm/boot/dts/overlays/*.dtb* /boot/overlays/ sudo cp arch/arm/boot/dts/overlays/README /boot/overlays/ ``` 最后,将编译生成的内核映像复制到/boot/目录: ``` sudo cp arch/arm/boot/zImage /boot/$KERNEL.img ``` 5. 重新启动树莓。使用以下命令重新启动树莓: ``` sudo reboot -f ``` 这样,你就完成了树莓4B的内核开发过程。请注意,这只是一个简单的概述,具体的步骤可能会因为不同的环境和需求而有所不同。建议在进行内核开发之前仔细阅读相关文档和指南。 #### 引用[.reference_title] - *1* [树莓4B内核驱动开发(二)本地编译内核](https://blog.csdn.net/wuspeng/article/details/114040075)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [树莓 4B 本地编译内核](https://blog.csdn.net/zhoutaopower/article/details/119416771)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值