【Linux|树莓派】分文件编程以及静态库动态库

news/2024/12/29 19:05:05/

一、分文件编程

  简单来说树莓派的分文件编程就是将一个项目的代码放在不同的文件里面,然后在主函数添加一个头文件,这样会使#控制字体颜色主程序变得简单
在编译的时候要将主函数和功能函数一起编译:
在这里插入图片描述
注意:include <stdio.h>include "calculatorfuncs.h" 的区别:
  前者表示引用标准库的头文件,编译时会从系统配置的库环境中去寻找,后者一般为用户自定义的头文件,比如分文件编程中自己定义的头文件,编译系统会从当前文件夹去寻找,如果找不到,则到系统的库文件中去寻找。

Linux中C/C++默认库环境:/usr/include,可使用ls /usr/include 查看。
在这里插入图片描述

二、linux库

使用GNU的工具我们如何在Linux下创建自己的程序函数库?
一个“程序函数库”简单的说就是一个文件包含了一些编译好的代码和数据,这些编译好的代码和数据可以在事后供其他的程序使用。程序函数库可以使整个程序更加模块化,更容易重新编译,而且更方便升级

程序函数库可分为3种类型:静态函数库(static libraries)、共享函数库(shared libraries)、动态加载函数库(dynamically loaded libraries):

  • 静态函数库是在程序执行前就加入到目标程序中去了 ;
  • 动态函数库同共享函数库是一个东西(在linux上叫共享对象库, 文件后缀是.so ,windows上叫动态加载函数库, 文件后缀是.dll)

Linux中命名系统中共享库的规则:
在这里插入图片描述

1、静态库优缺点

静态库在程序执行(编译)前就加入到目标程序中去了。
优点:
1.静态库被打包到应用程序中加载速度快
2.发布程序无需提供静态库,因为已经在app中,移植方便
缺点:
1.链接时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝。
2.更新、部署、发布麻烦。
在这里插入图片描述
简单来说,优点: 运行快,发布程序无需提供静态库,因为已经在app中,移植方便;
缺点:程序大,链接时完整的拷贝到执行文件中,会有多份冗余拷贝,更新部署麻烦。

2、动态库优缺点

动态函数库是在程序执行时动态(临时)由目标程序去调用。
优点:
1.链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序可以共用,节省内存。
2.程序升级简单,因为app里面没有库的源代码,升级之后只要库的名字不变,函数名以及参数不变,只是实现做了优化,就能加载成功。
缺点:
1.加载速度比静态库慢
2.发布程序需要提供依赖的动态库
在这里插入图片描述
简单来说,优点:程序小,链接时不用复制,程序运行时由系统动态加载到内存中,系统只加载一次,供多个程序共用,节省空间,程序升级简单,升级后只要库名字,函数名以及参数不变,只是做了优化就能加载成功。
缺点:运行慢,加载速度比静态库慢,发布程序需要提供依赖的动态库。

三、库的制作和使用

1、静态库制作和使用

静态库格式:libxxx.a
制作:

$gcc name.c -c
$ar rcsv libname.a name.o
a - name.o

编译:
链接到刚刚生成的静态库libname.a

$gcc test.c -lname -L./ -o mainStatic
./mainStatic

-lname(-l后加libname.a掐头去尾)
-L是告诉gcc编译器从-L制定的路径去找静态库(这里指定gcc编译器先从当前路径去找静态库),不用-L的话就会从默认的/usr/lib 或者/usr/local/lib路径去找静态库。
在这里插入图片描述

2、动态库制作和使用

动态库格式:libxxx.so
制作:

$gcc -shared -fpic name.c -o libname.so

-shared 指定生成动态库
-fpic 标准,fPIC 选项作用于编译阶段,在生成目标文件时就得使用该选项,以生成位置无关的代码
编译:

$gcc test.c -lname -L./ -o mainDynamic
./mainDynamic

在这里插入图片描述
注意:
动态库这里直接./mainDynamic运行的话会出错,因为动态函数库是在程序执行时(临时)由目标程序去调用,所以这里会出错。

  • 方法一:在配置文件/etc/ld.so.conf中指定动态库搜索路径
    vi /etc/ld.so.conf添加 lib目录
    在这里插入图片描述
    修改后需要运行ldconfig命令。
  • 方法二:通过环境变量LD_LIBRARY_PATH指定动态库搜索路径(临时的使用
    export LD_LIBRARY_PATH="/home/pi/STUDY/library"
    在这里插入图片描述
    a.为了可以在多个窗口都可以使用动态库,可以写一个shell脚本来实现
    export LD_LIBRARY_PATH="/home/pi/STUDY/library"
    ./mainDynamic
    在这里插入图片描述
    b.给shell脚本添加可执行的权限
    chmod +x start.sh
    在这里插入图片描述
  • 方法三:直接将库文件复制到/lib或则/user/lib目录下
    sudo cp libcalculatorfuncs.so /user/lib
    在这里插入图片描述

参考:
1、Linux共享库、静态库、动态库详解
2、Linux中的库

最后谢谢阅读,笔者乃小白,如有错误之处还请指正。


http://www.ppmy.cn/news/2008.html

相关文章

【华为上机真题 2022】流水线

&#x1f388; 作者&#xff1a;Linux猿 &#x1f388; 简介&#xff1a;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我&#xff0c;关注我&#xff0c;有问题私聊&#xff01; &…

鸢尾花数据种类预测、分析与处理、scikit-learn数据集使用、seaborn作图及数据集的划分

一、鸢尾花种类预测 Iris数据集是常用的分类实验数据集&#xff0c;由Fisher, 1936收集整理&#xff0c;Iris也称鸢尾花卉数据集&#xff0c;是一类多重变量分析的数据集 鸢尾花数据集包含了 4个属性&#xff08;特征值&#xff09; Sepal.Length&#xff08;花萼长度&#…

基于STM32的智能GPS定位系统(云平台、小程序)

背景及目标 前阵子&#xff0c;准确的说是好几个月前买了一辆电瓶车&#xff0c;当时呢因为车停得很随意&#xff0c;所以想给小电驴装一个GPS&#xff0c;一方面是防盗&#xff0c;另一方面是为了测速和绘制骑行轨迹&#xff0c;要是能联动电瓶车状态远程监测就更好了。当然我…

用二元泊松模型预测2022世界杯8强

用二元泊松模型预测2022世界杯8强 网上有很多文章用双泊松&#xff08;Double Poisson&#xff09;模型来预测世界杯比赛结果。但是双泊松模型有一个严重的缺陷&#xff0c;那就是它假设比赛中两队的比分是条件独立的。而我们都知道&#xff0c;在对抗性比赛中&#xff0c;两…

Hash与ZSet的常用命令以及其底层数据结构

目录hash类型命令hsethgethmsethmgethgetallhsetnxhdelhexitshincrby与hincrbyfloathkeys与hvalshlenhstrlen有序set型命令zaddzrange 与zrevrangezrangebyscore与zrevrangebyscorezcardzcountzscorezincrbyzrank 与 zrevrankzremzremrangebyrankzremrangebyscorezrangebylexzl…

基于51单片机的贪吃蛇游戏设计

1绪 论 1.1本课题研究的背景及意义 随着当今社会的发展&#xff0c;人们的生活节奏变得越来越快&#xff0c;人们开始逐渐的融入全球化的世界。人们已经不再局限于一小块天地&#xff0c;加班&#xff0c;出差已经占据了现代人生活的绝大部分。这个时候&#xff0c;一款简单易携…

Python——协程(Coroutine),异步IO

目录 生成器(Generator) yield表达式的使用 生产者和消费者模型 ​编辑 yield from表达式 协程(Coroutine) asyncio.coroutine async/await 总结 由于GIL的存在&#xff0c;导致Python多线程性能甚至比单线程更糟。 于是出现了协程&#xff08;Coroutine&#xff09;这…

防火墙nat实验

♥️作者&#xff1a;小刘在C站 ♥️每天分享云计算网络运维课堂笔记&#xff0c;一起努力&#xff0c;共赴美好人生&#xff01; ♥️夕阳下&#xff0c;是最美的&#xff0c;绽放。 目录 一.图纸 二.命令 一.图纸 二.命令 ciscoasa> ciscoasa> en ciscoasa# conf t…