当前位置: 首页 > 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;只能埋头…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

服务器硬防的应用场景都有哪些?

服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式&#xff0c;避免服务器受到各种恶意攻击和网络威胁&#xff0c;那么&#xff0c;服务器硬防通常都会应用在哪些场景当中呢&#xff1f; 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

Map相关知识

数据结构 二叉树 二叉树&#xff0c;顾名思义&#xff0c;每个节点最多有两个“叉”&#xff0c;也就是两个子节点&#xff0c;分别是左子 节点和右子节点。不过&#xff0c;二叉树并不要求每个节点都有两个子节点&#xff0c;有的节点只 有左子节点&#xff0c;有的节点只有…...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录&#xff0c;但是由于这个树组件的节点越来越多&#xff0c;导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多&#xff0c;导致的浏览器卡顿&#xff0c;这里很明显就需要用到虚拟列表的技术&…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...