使用树莓派学习——Linux库编程

news2024/9/24 15:28:20

树莓派开发——Linux静态动态库

文章目录

  • 树莓派开发——Linux静态动态库
    • 一、分文件编程
      • 1.1 分文件编程的优点:
      • 1.2 分文件编程的步骤:
    • 二、Linux的库
      • 2.1 函数库的概念:
      • 2.2 静态库和动态库的比较:
          • 静态数据库(libXXX.a)
            • 优点
            • 缺点
          • 动态数据库(libXXX.so)
            • 优点
            • 缺点
      • 2.3 静态库的生成和使用:
        • 2.3.1 静态库的制作步骤:
        • 2.3.2 静态库的使用:
      • 2.4 动态库的生成和使用:
        • 2.4.1 动态库的制作步骤:
        • 2.4.2 动态库的使用:

一、分文件编程

在之前的学习中,面对较大的项目比如 香橙派实现的智能垃圾桶等 ,都使用了分文件编程的思路。其实现的核心思想就是:将功能性函数的实现单独写在其他的地方,在main函数中调用那些封装好的功能性函数。

1.1 分文件编程的优点:

  • 分模块的编程思想:在实际工作中面对大型项目,可以让A完成串口开发;B完成网络开发,最后只需要他们提供h文件中的函数接口就可以在主函数中直接调用了,测试时发现哪部分有问题可以直接找负责的人,方便调试
  • 代码可移植性更强:因为分文件编程了,串口,网络,语音可能都被封装好了,那么后续如果其他项目需要这些功能就可以直接调用封装好的接口了,最多只需要微调
  • main函数更加精简:由于把功能性函数的实现步骤都封装到其他文件了,main函数就可以专注于项目的整体调用逻辑,使得整个main看起来更加清晰,逻辑通畅

1.2 分文件编程的步骤:

  1. 将功能性函数名和具体实现步骤写在一个**.c**文件中
  2. 创建一个同名的.h文件,包含所有可能会被调用的函数原型去除函数体
  3. main中包含刚刚创建的**.h**文件
  4. main中调用被封装好的函数接口
  5. 使用gcc 编译所有相关的**.c文件**(封装函数的.c文件main函数所在的.c文件
  • test.h文件的格式:
#ifndef __TEST_H__
#define __TEST_H__

int add(int x, int y);
int min(int x, int y);
float div(int x, int y);

#endif
  • test.c文件的格式:
int add(int x, int y)
{
   //函数体 
}
int min(int x, int y)
{
    //函数体
}
float div(int x, int y)
{
    //函数体
}
  • main函数调用h文件格式:
#include <stdio.h>
#include "test.h"

int main()
{
    //函数体
    return 0;
}

二、Linux的库

分文件编程的好处已经在刚刚说到,但是实际工作中会出现这种情况:程序员允许别人可以调用他封装好的功能性函数,但是他不希望别人可以看到他具体实现的函数体。在这种情况下,就要引入Linux的库的概念了!

2.1 函数库的概念:

库(程序函数库)是一种可执行的二进制形式、就是将源代码转化为二进制格式,相当于进行了加密,别人可以使用库,但是看不到库中的内容。

库是别人写好的现有的,可以复用的代码,现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。

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

  • 静态函数库:在程序执行前就加入到目标程序中的库, 文件后缀是.a
  • 共享函数库:在程序执行时动态(临时)由目标程序去调用,共享函数库=动态函数库=共享对象库(Linux), 文件后缀是.so
  • 动态加载函数库:本质上和共享函数库是一个东西,“动态加载数据库”是windows中的叫法,文件后缀是.dll

因此,对于Linux系统来说可以简单的将库分为 动态库静态库

2.2 静态库和动态库的比较:

静态数据库(libXXX.a)
优点
  1. 运行快
  2. 发布程序无需提供静态库,因为已经在app中,移植方便
缺点
  1. 程序大
  2. 更新部署发布麻烦
动态数据库(libXXX.so)
优点
  1. 程序小
  2. 升级简单
  3. 不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享(动态)库的实例
缺点
  1. 运行相对慢
  2. 需要提供依赖的动态库

在这里插入图片描述

2.3 静态库的生成和使用:

2.3.1 静态库的制作步骤:
  • 使用以下指令将**.c文件生成.o文件**
gcc a.c b.c -c

在这里插入图片描述

  • 使用以下指令将**.o文件打包成.a库文件**
ar rcs 静态库的名字 原材料
例:ar rcs libXXX.a a.o b.o

在这里插入图片描述

这两步完成后,就生成了.a库文件,此时实现功能函数的.c文件和.o文件对于程序运行就不必要了,使得main函数可以调用这个库的条件就是有.h和.a文件,此时代码执行者可以调用库但却无法得知库中函数具体的实现步骤了。

2.3.2 静态库的使用:
gcc test_main.c -ltest_func -L ./ -o a.out		//编译

gcc 			//使用gcc编译器编译
test_main.c		//main函数
-ltest_func		//-l(小写L):指定库的名字,库名砍头去尾
-L ./			//-L告诉gcc编译器从-L指定的路径(当前路径)去找静态库。默认是从/usr/lib  /usr/local/lib去找
-o a.out		//指定生成的最终应用程序的名字

在这里插入图片描述

2.4 动态库的生成和使用:

2.4.1 动态库的制作步骤:
  • 使用以下指令生成动态库:
gcc -shared -fpic xxx.c -o libxxx.so
//-shared用来生成动态库
//-fpic选项作用于编译阶段,在生成目标文件时就得使用该选项,以生成位置无关的代码

在这里插入图片描述

2.4.2 动态库的使用:
gcc test_main.c -ltest_func -L ./ -o a.out		//编译的语句其实和静态库相同
    
gcc 			//使用gcc编译器编译
test_main.c		//main函数
-ltest_func		//-l(小写L):指定库的名字,库名砍头去尾
-L ./			//-L告诉gcc编译器从-L指定的路径(当前路径)去找静态库。默认是从/usr/lib  /usr/local/lib去找
-o a.out		//指定生成的最终应用程序的名字

注意!虽然编译的语句相同,但是回顾动态库的缺点“需要提供依赖的动态库” ,所以编译完成后不能像使用静态库那样直接运行,这是因为动态库是程序运行中临时调用的,解决办法是将动态库拷贝到/usr/lib/下:

sudo cp libXXXX.so /usr/lib/

然后直接运行程序就可以了

将动态库复制到**/usr/lib//lib/下是因为程序执行时动态库的默认搜索路径就是/lib/usr/lib**;那么如果可以指定动态库的搜索路径,就可以不需要将库复制了,这就是另一种方法:使用环境变量LD_LIBRARY_PATH指定动态库搜索路径

export LD_LIBRARY_PATH="动态库所在的绝对路径"

在这里插入图片描述

通过添加这个环境变量,也可以成功运行程序了,但是这样做有一个问题:*这个环境变量是临时的,也就是说只有在当前窗口生效,如果此时通过SSH再连接一个窗口,又会找不到动态库了*,解决办法是:写一个脚本start.sh:

export LD_LIBRARY_PATH="动态库所在的绝对路径"
 
./可执行文件
export LD_LIBRARY_PATH="/home/pi/LinuxKu/Dyku"

./a.out

然后给脚本一个可执行的权限:

chmod +x start.sh

其实这个脚本的作用就是在每次执行程序前设置一个临时的环境变量。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2110506.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

奖项再+1!通义灵码智能编码助手通过可信 AI 智能编码工具评估,获当前最高等级

阿里云的通义灵码智能编码助手参与中国信通院组织的可信AI智能编码工具首轮评估&#xff0c;最终获得 4 级评级&#xff0c;成为国内首批通过该项评估并获得当前最高评级的企业之一。 此次评估以《智能化软件工程技术和应用要求 第 2 部分&#xff1a;智能开发能力》为依据&…

C/C++的自由落体运动

目录 1. 前言 2. 正文 2.1 问题 2.2 解决办法 2.2.1 思路 2.2.2 代码实现 2.2.3 测试结果 3. 备注 1. 前言 这个题目非常有意思&#xff0c;可以活跃自己的思维&#xff0c;毕竟代码来源于生活&#xff0c;又返回给生活。 2. 正文 2.1 问题 题目描述&#xff1a; …

携手共建云安全未来 |“集美大学服云实习基地”授牌仪式圆满举行

集美大学服云实习基地授牌仪式 9月3日&#xff0c;集美大学服云实习基地授牌仪式在厦门成功举行。集美大学科研处副处长茅剑、计算机工程学院副院长刘晋明&#xff0c;以及安全狗副总裁&CTO陈荣有、副总裁刘春辉共同出席此次的授牌仪式。 01 会上&#xff0c;安全狗副总裁刘…

梨花声音教育退费普通话学习技巧之了解文化背景

在学习普通话的过程中&#xff0c;了解中国的文化背景是不可或缺的一环。语言不仅是交流的工具&#xff0c;更是文化的载体。通过深入了解中国的历史、文化和社会背景&#xff0c;学习者可以更好地理解和掌握普通话&#xff0c;使语言学习变得更加生动有趣。本文将从几个方面详…

监控平台总结之面试常问答案

思路 延伸的面试题总结及答案&#xff1a; 1.说说前端监控平台/监控SDK架构设计和难点亮点&#xff1f; 架构设计 数据采集层: SDK: 在前端集成的 SDK 负责采集数据&#xff0c;包括性能指标、用户行为、错误日志等。 数据收集: 实现高效的数据采集机制&#xff0c;支持实时…

C++_多态详解

多态的概念 概念&#xff1a;需要去完成某个行为时&#xff0c;当 不同的对象去完成 会产生出不同的状态。通俗点说就是 不同类型的对象去做同一个行为&#xff0c;产生的结果不同。 多态的定义及实现 虚函数 定义&#xff1a;即被virtual修饰的类成员函数称为虚函数 虚函…

多门店管理下的高效IT运维策略与实战指南

连锁门店作为直接面向消费者的服务点&#xff0c;是企业与顾客建立联系的关键触点。随着商业竞争的加剧&#xff0c;连锁门店企业纷纷通过扩大实体店面的规模来抢占市场份额。随着门店数量的激增&#xff0c;门店IT运维管理的复杂性和挑战也日益凸显。本文将深入剖析门店IT运维…

828华为云征文|采用Flexus云服务器X实例部署RTSP直播服务器

一、前言 这篇文章讲解&#xff1a; 采用华为云最新推出的Flexus云服务器X实例搭建RTSP服务器&#xff0c;完成视频直播需求。 随着实时视频流传输需求的增长&#xff0c;RTSP&#xff08;实时流协议&#xff09;服务器成为了许多视频监控、直播和多媒体应用的核心组件。在当…

有趣的手机端见缝插针游戏源码

有趣的手机端见缝插针游戏源码下载&#xff0c;注&#xff1a;本地预览请用火狐浏览器模拟移动端&#xff0c;chrome本地预览存在跨域问题。 微信扫码获取源码

vue3 响应式 API:shallowRef()和shallowReactive()

shallowRef() shallowRef()是一个用于创建浅层响应式引用的函数。它创建一个响应式数据&#xff0c;但只对顶层属性进行响应式处理。 特点&#xff1a; 只跟踪引用值的变化&#xff0c;不关心值内部的属性变化。 <template><div>{{ shallowRefObj }}</div>…

LLM 模型压缩之三: FoldGPT

0. 资源链接 论文: FoldGPT: Simple and Effective Large Language Model Compression Scheme 项目: to be released. 1. 背景动机 现有的大语言模型推理存在以下问题&#xff1a; LLM 模型因为有大量的参数&#xff0c;以及 next token 的预测方式&#xff0c;导致 LLM 模…

关于vue项目启动报错Error: error:0308010C:digital envelope routines::unsupported

周五啦&#xff0c;总结一下这周遇到的个别问题吧&#xff0c;就是关于启动项目的时候其他的东西都准备好了&#xff0c;执行命令后报错Error: error:0308010C:digital envelope routines::unsupported 这里看一下我标注的地方&#xff0c;然后总结一下就不难发现问题所在 查看…

OBS怎么设置录制配置?3个电脑录屏小技巧妥妥教会你

OBS Studio是一款广受好评的开源录屏和直播软件&#xff0c;它以其强大的功能和用户友好的操作界面而闻名。对于初次接触OBS的用户来说&#xff0c;可能会对软件的众多按钮感到困惑。本文将为你提供一份简洁明了的OBS录屏指南&#xff0c;帮助你快速上手。 演示机型&#xff1a…

下载量10w+!LLM经典《大型语言模型:语言理解和生成》pdf分享

介绍 近年来&#xff0c;人工智能在新语言能力方面取得了显著进展&#xff0c;深度学习技术的快速发展推动了语言AI系统在文本编写和理解方面的表现。这一趋势催生了许多新功能、产品和整个行业的兴起。 本书旨在为Python开发者提供实用工具和概念&#xff0c;帮助他们利用预…

IP地址与MAC地址的区别:‌理解网络层与数据链路层的基石

在网络通信的广阔天地中&#xff0c;‌IP地址与MAC地址如同两座灯塔&#xff0c;‌各自照亮着不同的海域。‌它们虽然都扮演着标识网络设备的重要角色&#xff0c;‌但却在网络的不同层次上发挥着作用。‌本文将带您走进IP地址与MAC地址的世界&#xff0c;‌简述MAC与IP地址的区…

在SOLIDWORKS中高效转换:从实体模型到钣金件的设计优化

在设计生产中&#xff0c;当我们收到中间格式的模型文件时&#xff0c;并希望将其转换为钣金件以进一步加工生产&#xff0c;该怎么做呢&#xff1f; 利用SOLIDWORKS软件&#xff0c;可以直接将实体模型转换为钣金件&#xff0c;来完成后续的设计。 中性文件 钣金件 一、设置…

万象奥科参展“2024 STM32全国巡回研讨会”—深圳站、广州站

9月3日-9月5日&#xff0c;万象奥科参展“2024 STM32全国巡回研讨会”— 深圳站、广州站。此次STM32研讨会将会走进全国11个城市&#xff0c;展示STM32在智能工业、无线连接、边缘人工智能、安全、图形用户界面等领域的产品解决方案及多样化应用实例&#xff0c;深入解读最新的…

谷歌seo文章如何优化效果更好?

优化文章效果其实就是让它更吸引人&#xff0c;让读者有兴趣读下去&#xff0c;同时也要让搜索引擎喜欢&#xff0c;写作风格要亲切自然&#xff0c;用聊天的方式跟读者沟通&#xff0c;别让他们觉得在读一篇枯燥的报告&#xff0c;原创内容是关键&#xff0c;我们需要提供独特…

自称超越Transformer的新一代大模型RWKV是什么

论文地址&#xff1a;arxiv.org/pdf/2305.13048v2 项目地址&#xff1a;github 论文题目为&#xff1a;《RWKV: Reinventing RNNs for the Transformer Era》 自 Vaswani 等人于 2017 年首次提出 Attention Is All You Need 之后&#xff0c;基于 transformer 的强大的模型一…

jmeter同步定时器、固定定时器、统一随机定时器、常数吞吐量定时器详解

一、同步定时器 可以让多个线程同时向服务器发送请求&#xff0c;实现瞬间并发(相当于现实中同步秒杀商品)类似于集合点 例如&#xff1a;10个人约定去旅游&#xff0c;出发前提前会在某一个地方等到10个人同时都到了约定地点之后再一同排队上车 在任意接口下添加同步定时器模…