当前位置: 首页 > news >正文

嵌入式养成计划-34--函数库

七十二、 函数库

1. 库的概念

  1. 库是一个二进制可执行文件,与二进制可执行程序比较,库是不能单独运行的。

    1. 库中存放的是功能函数,没有主函数(main函数)

    2. 库需要被载入到内存中使用

    3. 标准的基础库中存放了很多已经写好的,成熟的,可以复用的功能代码,例如printf, scanf

  2. 不同操作系统有自己的库,不兼容

  • 库的分类
    1. 静态库
    2. 动态库
windowsLinux
静态库*.lblibxxx.a
动态库*.dlllibxxx.so

2. 静态库

1)原理

通过静态库封装的功能函数,在程序编译到 链接库 步骤的时候,会将函数 继承 到可执行程序中。

优点:

  1. 程序运行的时候,与静态库没有任何关系,方便移植。
  2. 运行速度比动态库快

缺点:

  1. 大。存储的时候浪费磁盘空间,运行的时候浪费内存空间。
  2. 程序更新部署比较麻烦。

2)制作指令

gcc -c func.c -o func.o         一步完成预处理,编译,汇编
ar -crs libxxx.a func.o         生成一个静态库,库的名字叫做xxxar -crs libxxx.a func1.o func2.o  func3.o

ar : 用于创建或操作静态库

-c : 创建静态库

-r : 将文件插入静态库或者替换静态库中的同名文件;

-s : 重置静态库索引

3)制作流程

  1. 分文件,将主函数与功能函数分开,例如分成:main.c func.c
  2. 编写头文件,例如:func.h
  3. 将main.c和func.c联合编译,验证分文件是否正确
  4. 调用上述静态库制作指令,创建一个静态库libxxx.a。注意静态库的名字是xxx
  5. 根据下面的使用方式,链接静态库即可

4)使用方式

gcc main.c -L库的路径 -l库的名字 最终生成一个a.out可执行二进制程序 gcc main.c -L库的路径 -l库的名字 -o main 最终生成一个main可执行二进制程序 -l:小写的L

3. 动态库(共享库)

1)原理

用动态库封装的功能函数,把库函数的链接推迟到 程序运行 的时候。

当程序执行到库函数的时候,会到内存中找动态库函数。

    1. 若内存中不存在该动态库函数,则会将该动态库函数加载到内存中
    2. 若内存中存在该动态库函数,则直接调用动态库函数,不会加载第二份

优点:

  1. 小,存储的时候节省磁盘空间,运行的时候节省内存空间
  2. 程序的更新部署比较方便,不需要重新编译烧录。

缺点:

  1. 程序运行的时候,若没有找到对应动态库函数,则会导致程序崩溃。
  2. 运行速度比静态库慢

2)制作指令

gcc -fPIC -c func.c -o func.o     完成预处理 编译 汇编
gcc -shared -o libxxx.so func.o   生成一个动态库,库的名字是xxx;gcc -shared -o libxxx.so func1.o func2.o func3.o

3)制作流程

  1. 分文件,将主函数与功能函数分开,例如分成:main.c func.c
  2. 编写头文件,例如:func.h
  3. 将main.c和func.c联合编译,验证分文件是否正确
  4. 调用上述动态库制作指令,创建一个动态库libxxx.so。注意动态库的名字是xxx
  5. 根据下面的使用方式,链接动态库即可

4)使用方式

在这里插入图片描述

原因:环境变量没有配置,若没有配置,则会默认到/lib/ 或者 /usr/lib/ 目录下查找动态库

5)环境变量配置

  1. 将动态库移动到 /lib/ 或者 /usr/lib/
sudo mv ./libmyfunc.so /lib/
  1. 在LD_LIBRARY_PATH这个环境变量中加上库所在的绝对路径
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:动态库所在目录的绝对路径export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/ubuntu/mydir/23071/02_socket/09_library/
只在设置终端有效
  1. 修改配置文档

1. cd  /etc/ld.so.conf.d
2. sudo  touch  xxx.conf  (xxx自定义可以修改)
3. sudo vim  xxx.conf   将动态库所在目录的绝对路径写入到文件中,且一行一个动态库目录路径。
4. 保存退出后,终端输入 sudo ldconfig 刷新环境变量

相关文章:

嵌入式养成计划-34--函数库

七十二、 函数库 1. 库的概念 库是一个二进制可执行文件,与二进制可执行程序比较,库是不能单独运行的。 库中存放的是功能函数,没有主函数(main函数) 库需要被载入到内存中使用 标准的基础库中存放了很多已经写好的…...

PM864AK01-eA 3BSE018161R2 工业人工智能供应链先驱

PM864AK01-eA 3BSE018161R2 工业人工智能供应链先驱 吞吐量和Macnica Networks的战略合作伙伴关系将使Macnica Networks的客户能够加速和量化智能工厂计划的投资回报(ROI)。高管、经理和运营负责人可以使用Macnica Networks领先的制造场所数据收集平台和ThroughPut基于约束理论…...

参与现场问题解决总结(Kafka、Hbase)

一. 背景 Kafka和Hbase在现场应用广泛,现场问题也较多,本季度通过对现场问题就行跟踪和总结,同时结合一些调研,尝试提高难点问题的解决效率,从而提高客户和现场满意度。非难点问题(历史遇到过问题&#xf…...

基于PSD-ML算法的语音增强算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 1.加窗处理: 2.分帧处理: 3.功率谱密度估计: 4.滤波处理: 5.逆变换处理: 6.合并处理: 5.算法完整程序工程 1.算法…...

【1++的Linux】之文件(一)

👍作者主页:进击的1 🤩 专栏链接:【1的Linux】 文章目录 一,初识文件二,文件接口 一,初识文件 文件就是文件内容属性。因此对文件的操作无非就是对文件内容的操作和对文件属性的操作。 我们访问…...

Kafka 高可用

正文 一、高可用的由来 1.1 为何需要Replication 在Kafka在0.8以前的版本中,是没有Replication的,一旦某一个Broker宕机,则其上所有的Partition数据都不可被消费,这与Kafka数据持久性及Delivery Guarantee的设计目标相悖。同时Pr…...

关于分布式操作系统

关于分布式操作系统,如果你不太理解的话,可以把它看成是传统操作系统延展。二者的区别在于,传统的操作系统都是单机系统,只能在一台计算机上运行,而分布式操作系统是多机系统,每台计算机都是系统中的一个计…...

Pytorch使用DataLoader, num_workers!=0时的内存泄露

描述一下背景,和遇到的问题: 我在做一个超大数据集的多分类,设备Ubuntu 22.04i9 13900KNvidia 409064GB RAM,第一次的训练的训练集有700万张,训练成功。后面收集到更多数据集,数据增强后达到了1000万张。…...

chromedriver下载与安装方法

下载与安装: 1.查看Chrome浏览器版本 首先,需要检查Chrome浏览器的版本。请按照以下步骤进行: 打开Chrome浏览器。 点击浏览器右上角的菜单图标(三个垂直点)。 选择“帮助”(Help)。 在下拉菜单中选择“…...

数据库查询详解

数据库查询操作 前置:首先我们创建一个练习的数据库 /* SQLyog Professional v12.09 (64 bit) MySQL - 5.6.40-log : Database - studentsys ********************************************************************* *//*!40101 SET NAMES utf8 */;/*!40101 SET …...

c++视觉ROI 区域和ROI 区域图像叠加

ROI 区域提取和ROI 区域图像叠加 ROI 区域提取 #include <opencv2/opencv.hpp>int main() {// 读取图像cv::Mat image cv::imread("1.jpg");// 检查图像是否成功加载if (image.empty()) {std::cerr << "Error: Could not read the image." …...

scrapy爬虫系列之安装及入门介绍

前面介绍了很多Selenium基于自动测试的Python爬虫程序,主要利用它的xpath语句,通过分析网页DOM树结构进行爬取内容,同时可以结合Phantomjs模拟浏览器进行鼠标或键盘操作。但是,更为广泛使用的Python爬虫框架是——Scrapy爬虫。这是一篇在Windows系统下介绍 Scrapy爬虫安装及…...

洛谷刷题:数组

好累&#xff0c;学习令我快乐 一、小鱼比可爱 题目链接&#xff1a;https://www.luogu.com.cn/problem/P1428 题目描述 人比人&#xff0c;气死人&#xff1b;鱼比鱼&#xff0c;难死鱼。小鱼最近参加了一个“比可爱”比赛&#xff0c;比的是每只鱼的可爱程度。参赛的鱼被从…...

【Linux常用命令4】系统状态监测命令---2

last&#xff1a;查看所有系统的登录记录 执行last命令时&#xff0c;它会读取/var/log目录下名称为wtmp的文件&#xff0c;并把该文件记录的登录系统或终端的用户名单全部显示出来。默认显示wtmp的记录&#xff0c;btmp能显示的更详细&#xff0c;可以显示远程登录&#xff0…...

uboot启动流程-uboot代码重定位说明二

一. uboot启动流程 本文学习 uboot 的启动流程中涉及的 uboot 代码重定位部分。 _main 函数中会调用 relocate_code 函数。 relocate_code 函数分两个部分&#xff1a; 1. 拷贝 uboot 代码部分 2. 有关 " 重定位后有关函数调用或全局变量地址的问题"的解决方法…...

<HarmonyOS第一课>ArkTS开发语言介绍——闯关习题及答案

判断题 1.循环渲染ForEach可以从数据源中迭代获取数据&#xff0c;并为每个数组项创建相应的组件。&#xff08; 对 &#xff09; 2.Link变量不能在组件内部进行初始化。&#xff08; 对 &#xff09; 单选题 1.用哪一种装饰器修饰的struct表示该结构体具有组件化能力&#…...

香橙派、树莓派、核桃派、鲁班猫安装jupyter notebook【ubuntu、Debian开发板操作类似】

文章目录 前言一、安装环境二、使用方法总结 前言 香橙派树莓派鲁班猫安装一下调试代码还是比较方便的。 一、安装环境 假设已经安装好了miniconda3。如果还没安装可以参考我另外一篇博文&#xff0c;有写怎么安装。 pip install jupyter notebook # 生成Jupyter Notebook的…...

tomcat整体架构

Tomcat介绍 Tomcat是Apache Software Foundation&#xff08;Apache软件基金会&#xff09;开发的一款开源的Java Servlet 容器。它是一种Web服务器&#xff0c;用于在服务器端运行Java Servlet和JavaServer Pages (JSP)技术。它可 以为Java Web应用程序提供运行环境&#x…...

实现协议互通:探索钡铼BL124EC的EtherCAT转Ethernet/IP功能

钡铼BL124EC是一种用于工业网络通信的网关设备&#xff0c;专门用于将EtherCAT协议转换成Ethernet/IP协议。它充当一个桥梁&#xff0c;连接了使用不同协议的设备&#xff0c;使它们能够无缝地进行通信和互操作。 具体来说&#xff0c;BL124EC通过支持EtherCAT&#xff08;以太…...

Android之App跳转其他软件

文章目录 前言一、效果图二、实现步骤1.弹框xml(自己替换图标)2.弹框utils3.两个弹框动画4.封装方便调用5.调用6.长按事件方法7.跳转步骤8.复制utils 总结 前言 最近遇到一个需求&#xff0c;就是App内大面积需要长按复制并跳转指定App&#xff0c;没办法&#xff0c;只能埋头…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频

使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案

这个问题我看其他博主也写了&#xff0c;要么要会员、要么写的乱七八糟。这里我整理一下&#xff0c;把问题说清楚并且给出代码&#xff0c;拿去用就行&#xff0c;照着葫芦画瓢。 问题 在继承QWebEngineView后&#xff0c;重写mousePressEvent或event函数无法捕获鼠标按下事…...

nnUNet V2修改网络——暴力替换网络为UNet++

更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...

ubuntu22.04有线网络无法连接,图标也没了

今天突然无法有线网络无法连接任何设备&#xff0c;并且图标都没了 错误案例 往上一顿搜索&#xff0c;试了很多博客都不行&#xff0c;比如 Ubuntu22.04右上角网络图标消失 最后解决的办法 下载网卡驱动&#xff0c;重新安装 操作步骤 查看自己网卡的型号 lspci | gre…...

算法—栈系列

一&#xff1a;删除字符串中的所有相邻重复项 class Solution { public:string removeDuplicates(string s) {stack<char> st;for(int i 0; i < s.size(); i){char target s[i];if(!st.empty() && target st.top())st.pop();elsest.push(s[i]);}string ret…...

边缘计算网关提升水产养殖尾水处理的远程运维效率

一、项目背景 随着水产养殖行业的快速发展&#xff0c;养殖尾水的处理成为了一个亟待解决的环保问题。传统的尾水处理方式不仅效率低下&#xff0c;而且难以实现精准监控和管理。为了提升尾水处理的效果和效率&#xff0c;同时降低人力成本&#xff0c;某大型水产养殖企业决定…...