【树莓派系列】交叉编译工具、交叉编译链的安装使用

news2024/11/28 8:45:02

交叉编译工具、交叉编译链的安装使用

文章目录

  • 交叉编译工具、交叉编译链的安装使用
    • 一、交叉编译
      • 1.1什么是交叉编译
      • 1.2为什么要交叉编译
      • 1.3宿主机和目标机
    • 二、搭建交叉编译工作环境
      • 2.1安装工具链
      • 2.2配置环境变量
        • ● 配置临时环境变量
        • ● 配置永久环境变量
    • 三、交叉编译宿主机和目标机
      • 3.1交叉编译出可执行文件
      • 3.2宿主机编译生成的可执行文件下载到目标机(开发板)
    • 四、交叉编译带wiringPi库的程序
    • 五、软链接和硬链接
      • 5.1 软链接
      • 5.2 硬链接
    • 六、带有wiringPi库进行交叉编译
    • 附录
      • 检索目录下所有带有gcc的命令
      • 注意:踩坑1
  • 最新补充:最新版的软链接指向变了
      • 踩坑2:

一、交叉编译

1.1什么是交叉编译

(1)编译:是在一个平台上生成在该平台上的可执行代码

(2)交叉编译:是在一个平台上生成另一个平台上的可执行代码。

玩过51单片机的应该都知道,我们是在Windows上面编译,生成.hex文件,烧录到单片机上面,在51单片机上面运行,这其实就是最早的交叉编译。那为什么不在单片机上面运行编译,要在Windows上面,因为单片机安装不下配置环境,内存很小。

现在我们要做的就是不在树莓派什么进行编译了,在ubantu(本篇文章在虚拟机下\宿主机,进行编译代码,然后跑到树莓派上面运行)

● 我们在windows上面编写C51代码,并编译成可执行代码,如xx.hex,是在c51上面运行,不是在windows上面运行;

● 我们在ubuntu上面编写树莓派的代码,并编译成可执行代码,如a.out,是在树莓派上面运行,不是在ubuntu linux上面运行

1.2为什么要交叉编译

  1. 平台上不允许或不能够安装我们所需要的编译器比如C51;
  2. 因为目的平台上的资源贫乏,无法运行我们所需要编译器;
  3. 树莓派作为一款强大的开发板,同样也需要用到交叉编译。树莓派有时因为目的平台还没有建立,暂无操作系统,所以根本不能运行编译器。
  4. 操作系统也是代码,也要编译!

1.3宿主机和目标机

平台运行需要两样至少东西:bootloader(启动引导代码)以及操作系统核心。

● 宿主机(host) :编辑和编译程序的平台,一般是基于X86的PC机,通常也被称为主机(电脑X86)。
● 目标机(target):用户开发的系统,通常都是非X86平台。host编译得到的可执行代码在target上运行(树莓派ARM)。

二、搭建交叉编译工作环境

2.1安装工具链

树莓派官方下载网址:https://github.com/raspberrypi/

交叉工具链下载链接:https://github.com/raspberrypi/tools.git

1.下载工具链

两种方法下载工具链:
    方法一:直接去官网下载,具体步骤看下图
    方法二:输入命令 git clone https://github.com/raspberrypi/tools.git

方法一

image-20240828102857840
搜索tools,找到tools工具

image-20240828102930383

之后下载完成之后导入到ubantu系统之中即可

image-20240828103029074

下载完之后,自己找一个文件夹,解压出来。

(如果是使用git命令下载下来的,默认就是一个tools文件,无需再解压)

unzip tools-master.zip

2.进入文件目录中,依次进入如下目录直到bin目录(64位计算机就如下选择)

进入bin目录里,找到 arm-linux-gnueabihf-gcc

cd tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin

image-20240828105607064

3.ls -l 查看bin目录底下各文件权限,arm-linux-gnueabihf-gcc作为软连接,实际用到的可执行程序是它后面的arm-linux-gnueabihf-gcc-4.8.3

ls -l

image-20240828105832860

2.2配置环境变量

临时:只在当前页面有效,风险性高,离开当前页面又需要重新配置;

永久:任何页面或路径下都有效,安全可靠

(1)Linux环境变量的作用和配置方法其实和Windows的环境变量一样,不一样的只有界面而已;

(2)在上面操作交叉编译工具链可以看到,要使用工具链就必须进入层层目录,繁琐且麻烦,降低开发效率;

(3)配置环境变量就能很好的解决这一问题;

● 配置临时环境变量

(1)echo $PATH :显示当前的环境变量;

image-20240828193243667

(2)pwd :找到tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin,并复制;

(3)export PATH=$PATH:自定义路径

(4)arm-linux-gnueabihf-gcc -v :检查是否找到,如果不配置的话只能在工具链的目录找到,配置完之后在任何目录下都可找到

export PATH=$PATH:/home/a/tools/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin

临时变量重启之后就没了。

● 配置永久环境变量

(1)修改工作目录下的.bashrc 隐藏文件,配置命令终端的vi /home/你的用户名/.bashrc 打开后在文本最后一行加入以下内容:

export PATH=$PATH:你的工具链存放的路径

(2)source /home/用户名/.bashrc 加载配置文件,马上生效配置。

export PATH=$PATH:/home/a/tools/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin

指令arm-linux-gnueabihf-gcc -v 检查交叉工具链是否是4.8.3版本

arm-linux-gnueabihf-gcc -v

image-20240828111006436

三、交叉编译宿主机和目标机

3.1交叉编译出可执行文件

检查交叉编译工具链arm-linux-gnueabihf-gcc -v

在Ubuntu上编写一个简单的程序:程序的文件名为:hello.c

#include <stdio.h>

int main()
{
    printf("hello,world");
    return 0;
}

我们分别查看一下常规编译与交叉编译生成的可执行程序的区别。

常规编译(使用gcc编译器编译):gcc hello.c -o a

交叉编译(使用树莓派的交叉编译器arm-linux-gnueabihf-gcc编译):arm-linux-gnueabihf-gcc hello.c -o b

file命令查看可程序a和b的属性:

● a在x86-64位计算机上面运行(宿主机-电脑),无法在ARM平台上运行

● b在ARM平台上运行(目标机-树莓派),无法在X86平台上运行(这是一个二进制文件)

image-20240828161334211

3.2宿主机编译生成的可执行文件下载到目标机(开发板)

使用scp命令,可通过网络IP实现文件的互传。

scp b pi@192.168.x.xxx:/home/pi

指令 文件名 开发板用户名@开发板地址:开发板的绝对路径

此方法也可以将目标机文件传至宿主机

四、交叉编译带wiringPi库的程序

说明:在树莓派中编写带wiringPi库的程序时(比如IO口),直接在程序中加头文件#include <wiringPi.h>,在编译的时候-l链接wiringPi库即可,因为树莓派自带有wiringPi库,在/usr/lib目录下。在Ubuntu中或者宿主机中没有自带wiringPi的库,那么很明显无法顺利完成带wiringPi库程序的交叉编译。

git clone git://git.drogon.net/wiringPi

出现的问题:

1.现在写一个wiringPi.h的程序。

//demo.c
#include <stdio.h>
#include <wiringPi.h>
#include <stdlib.h>

#define PIN 7  //#define宏定义控制引脚为GPIO.7

int main()
{
 int cmd;

 if(wiringPiSetup() == -1){  //初始化wiringPi库
     printf("init error\n");
     return -1;
 }

 pinMode(PIN,OUTPUT); //设置为输出io口
 digitalWrite(PIN,HIGH);//默认断电状态
 while(1){
     printf("please input 0 or 1:0-close,1-open\n");//输入0或1,0关闭,1打开
     scanf("%d",&cmd);

     if(cmd == 1){
         digitalWrite(PIN,LOW);//输入的是1,就给低电平,供电     
     }else if(cmd == 0){
         digitalWrite(PIN,HIGH);//输入的是0,就给高电平,断电 
     }else{
         printf("OUTPUT error\n");//如果输入的不是1或0
         digitalWrite(PIN,HIGH);//就自动断电
         exit(-1);            //并退出
     }
 }
 return 0;
}

2.交叉编译这个文件,我们发现找不到这个头文件

arm-linux-gnueabihf-gcc demo.c

image-20240831205347929

3.OK好,那我去找到这个头文件,直接链接到目录下就可以了吧

我们找到他在目录:/home/a/raspberrypi/WiringPi/wiringPi下。

image-20240831205523912

4.我们之间链接到头文件目录下,发现报错又变了

arm-linux-gnueabihf-gcc demo.c -I /home/a/raspberrypi/WiringPi/wiringPi

image-20240831205741249

5.这个报错其实是跟树莓派一样的,如果不链接到库

//这个代码如果在树莓派底下运行同样会报相同的错误,gcc demo.c -lwiringPi 就可以解决
gcc demo.c

6.那我们再试一下,发现报错又变了,这个**-l**是去哪里链接了呢?他找不到这个库

arm-linux-gnueabihf-gcc demo.c -I /home/a/raspberrypi/WiringPi/wiringPi -lwiringPi

image-20240831210134339

7.-l,一般都会跑到**/usr/local/lib**下面去链接库

ls /usr/local/lib

image-20240831210306195

8.接下来我们怎么做?直接去树莓派主机上面,把他的wiringpi库拿来用。

● 将树莓派中自带的wiringPi库下载到Ubuntu或宿主机中
cd /usr/lib :树莓派wiringPi库的文件路径;

image-20240831214144106

ls -l |grep wiringPi :过滤出只有wiringPi库的相关文件

->表示软链接的意思

image-20240831214204260

③ 将软链接libwiringPi.so指向的libwiringPi.so.2.52下载到Ubuntu或宿主机中:

scp libwiringPi.so.2.52 a@192.168.x.x:/home/a/raspberrypi
指令 需要拷贝的文件名    目标用户名  ip     拷贝的目标路径
    scp libwiringPi.so.2.52 a@192.168.237.130:/home/a/raspberrypi

注意:这里要拷贝软连接指向的文件,如果直接拷贝软链接到Ubuntu,Ubuntu里并不会生成我们要的软链接。

需要我们自己生成软链接

五、软链接和硬链接

5.1 软链接

● 软链接文件有类似于Windows的快捷方式;

● 在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息;

● 在选定的位置上生成一个文件的镜像,不会占用磁盘空间。

生成方法:

还记得我们之前学的生成动态库的过程吗,就是以.so结尾的

ln -s libwiringPi.so.2.52 libwiringPi.so
指令 参数 要被链接的文件    要生成的软链接文件名字

image-20240901164332340

5.2 硬链接

● 在选定的位置上生成一个和源文件大小相同的文件;

● 硬链接通过索引节点来进行链接;在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。在Linux中,多个文件名指向同一索引节点是存在的。一般这种连接就是硬连接

允许一个文件拥有多个有效路径名,这样用户就可以建立硬链接到重要文件,以防止“误删”的功能。因为对应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放,也就是说,文件真正删除的条件是与之相关的所有硬连接文件均被删除。

生成方法:

ln libwiringPi.so.2.50 libwiringPi.so 
没有参数 -s

无论是软链接还是硬链接,文件都保持同步变化

六、带有wiringPi库进行交叉编译

编译时通过-I -L来指定相关库的路径

● -I (注意是大写的i) 给gcc添加自定义的头文件的路径

● -L 给gcc添加额外的搜索库的路径

**说明:**demo.c是带有wiringPi.h的一个文件,是需要连接wiringPi库使用的程序;-I的wiringPi库的头文件是自行网上下载的wiringPi库的包;-L的wiringPi库是树莓拷贝到Ubuntu中的 。

arm-linux-gnueabihf-gcc demo.c -I /home/a/raspberrypi/WiringPi/wiringPi -L. -lwiringPi -o test
交叉编译工具链     树莓关于IO口文件   -I wiringPi库头文件路径             -L .在当前目录下 wiringPi库

附录

检索目录下所有带有gcc的命令

grep gcc -nir 

注意:踩坑1

查看一下工具链下的readme文档,安装了工具链

sudo apt-get install gcc-arm-linux-gnueabihf -y

image-20240828110519931

sudo apt-get install gcc-arm-linux-gnueabihf -y,安装完之后已经无需再配置环境变量了,配置环境变量这一部分可以直接跳过,如果无法使用再跳回来配置。

最新补充:最新版的软链接指向变了

变成了9.4.0的版本,这个时候,交叉编译是可以通过的,但是在后面进行wiringPi库链接时,就会出现一大堆问题,报错代码如下。解决办法就是将下载的交叉工具编译链全部卸载,严格按照上面的步骤进行下来。

image-20240901201416243

a@ubuntu:~/raspberrypi$ arm-linux-gnueabihf-gcc demo.c -I /home/a/raspberrypi/WiringPi/wiringPi -L. -lwiringPi -o test
    
/usr/lib/gcc-cross/arm-linux-gnueabihf/9/../../../../arm-linux-gnueabihf/bin/ld: warning: libcrypt.so.1, needed by ./libwiringPi.so, not found (try using -rpath or -rpath-link)
/usr/lib/gcc-cross/arm-linux-gnueabihf/9/../../../../arm-linux-gnueabihf/bin/ld: ./libwiringPi.so: undefined reference to `crypt@GLIBC_2.4'
collect2: error: ld returned 1 exit status

踩坑2:

报错:/libwiringPi.so: undefined reference to fcntl@GLlBC 2.28’交叉编译wiringPi库遇到了这个错误

因为要链接到动态库:-lwiringPi。

但是因为宿主机与目标机的glibc的版本不一样,你可以理解为gcc的编译版本不一致。

宿主机x86的为:2.31版本,而目标机ARM上面的为2.28版本

这个错误通常是由于交叉编译时使用的 gjlibc 版本与目标系统上的 glibc 版本不兼容导致的。GLIBC 2.28 是在较新的 glibc 版本中引入的函数,如果您的目标系统上的 glibc 版本低于 2.28,则会出现该错误。
解决这个问题的一种方法是更新目标系统上的 glibc 版本,以便与编译时使用的版本匹配。如果您无法更新目标系统上的 glibc 版本,可以尝试降低编译时使用的 glibc 版本。

博主做了哪些尝试呢?

第一个:在宿主机上面自己做一个wiringPi动态库,之前有讲过如何制作,找到官方的wiringPi库,进行制作。

但是后面由于不知道具体包含哪些源文件,所以制作出来的会报一些错误,用不了。

在这里我们要注意一下,-lwiringPi,链接的这个库libwiringPi.so必须是ARM架构的,也就是制作动态库时要用交叉编译arm-linux-gnueabihf-gcc,来编译这些文件

image-20240902111348966

第二个:把官方wiringPi下载下来之后可以自己配置,但是他们默认是使用的gcc工具进行编译,编译完成之后这个.so文件是x86架构的,所以导致与目标机的架构不匹配,也无法运行。

image-20240902111554445

解决办法:输入命令,我们发现好多都是gcc来编译的,在宿主机上面gcc编译出来的东西肯定是X86架构的,想要编译出来ARM架构的就需要arm-linux-gnueabihf-gcc来进行交叉编译。那么我们将gcc换成arm-linux-gnueabihf-gcc不就可以了吗

grep gcc -nir 

image-20240902115039675

你可以使用 sed 命令或文本编辑器来批量替换 Makefile 中的 gcc。以下是使用 sed 命令的示例

find . -name 'Makefile' -exec sed -i 's/gcc/arm-linux-gnueabihf-gcc/g' {} +

这个命令会在当前目录及其子目录下查找所有名为 Makefile 的文件,并将其中的 gcc 替换为 arm-linux-gnueabihf-gcc

image-20240902115556848

2.确保替换操作成功执行。你可以使用 grep 命令确认 gcc 是否已被替换:

grep -r 'arm-linux-gnueabihf-gcc' .

3.将所有gcc的换成arm-linux-gnueabihf-gcc之后,我们就可以回到wiringPi库底下重新进行安装。

./bulid

image-20240902115637609

4.这时我们再查看这个.so文件时,已经变成ARM架构的了

image-20240902115737616

5.交叉编译运行wiringPi库

已经可以编译成功了,比较纳闷的就是,指定在/usr/local/lib目录下去找wiringPi库找不到,我把他复制到当前目录下,并创建好软链接之后便可以生成可执行文件且可以运行了。不过好歹也是能够交叉编译wiringPi库了。

image-20240902120018636

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

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

相关文章

NASA:Seasat-A 散射计(SASS)得出的风速和风向矢量数据集

目录 简介 摘要 代码 引用 网址推荐 0代码在线构建地图应用 机器学习 SEASAT SCATTEROMETER DEALIASED OCEAN WIND VECTORS (Atlas) 简介 SEASAT散射计反回波强度&#xff08;scattering&#xff09;提供了对海面风速和风向的估计。SEASAT散射计被用来获取海面风场的信…

LabVIEW提高开发效率技巧----调度器设计模式

在LabVIEW开发中&#xff0c;针对多任务并行的需求&#xff0c;使用调度器设计模式&#xff08;Scheduler Pattern&#xff09;可以有效地管理多个任务&#xff0c;确保它们根据优先级或时间间隔合理执行。这种模式在需要多任务并发执行时特别有用&#xff0c;尤其是在实时系统…

【算法】---归并排序(递归非递归实现)

参考 左程云算法 算法导论 前言 本篇介绍 归并排序分治法 前置知识 了解递归&#xff0c; 了解数组。 引入 归并排序 归并排序最早是由公认的现代计算机之父John von Neumann发明的&#xff0c; 这是一种典型的分治思想应用。 我们先介绍分治思想 分治思想 分治思想的…

java:pdfbox 3.0 去除扫描版PDF中文本水印

官网下载 https://pdfbox.apache.org/download.html下载 pdfbox-app-3.0.3.jar cd D:\pdfbox 运行 java -jar pdfbox-app-3.0.3.jar java -jar pdfbox-app-3.0.3.jar Usage: pdfbox [COMMAND] [OPTIONS] Commands:debug Analyzes and inspects the internal structu…

(C语言贪吃蛇)7.显示贪吃蛇完整身体改进

前言 上节显示了贪吃蛇身子的三个节点&#xff0c;但是吃了食物后蛇身变长应该如何操作&#xff0c;本节给出答案。 一、贪吃蛇身体是什么&#xff1f; 使用链表这个数据结构来动态的显示贪吃蛇的身体。 二、对贪吃蛇身体进行改进 1.贪吃蛇身子显示 代码如下&#xff1a; …

信息学奥赛使用的编程IDE:Dev-C++ 安装指南

信息学奥赛&#xff08;NOI&#xff09;作为全国性的编程竞赛&#xff0c;要求参赛学生具备扎实的编程能力&#xff0c;而熟练使用适合的编程工具则是学习与竞赛的基础。在众多编程环境中&#xff0c;Dev-C IDE 因其简洁、轻量、支持C编程等特点&#xff0c;成为许多参赛者的常…

最新版的dubbo服务调用(用nacos做注册中心用)

一、介绍 1.1、什么是 nacos Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称&#xff0c;一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集&a…

Java 每日一刊(第21期):反射机制

文章目录 前言动态插件系统面临的问题如何在运行时动态加载和调用类与方法设计模式的尝试引入反射 Java 反射的核心概念Class 类Constructor 类Method 类Field 类 Java 反射的应用场景框架开发插件系统序列化与反序列化动态代理测试工具 反射的优缺点反射实战动态加载类并调用方…

【hot100-java】【将有序数组转换为二叉搜索树】

二叉树篇 BST树 递归直接实现。 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNo…

【C++差分数组】2381. 字母移位 II|1793

本文涉及知识点 C差分数组 LeetCode2381. 字母移位 II 给你一个小写英文字母组成的字符串 s 和一个二维整数数组 shifts &#xff0c;其中 shifts[i] [starti, endi, directioni] 。对于每个 i &#xff0c;将 s 中从下标 starti 到下标 endi &#xff08;两者都包含&#…

STM32的串行外设接口SPI

一、SPI简介 1.SPI总线特点 &#xff08;1&#xff09;四条通信线 SPI需要SCK、MISO、MOSI、NSS四条通信线来完成数据传输 &#xff0c;每增加一个从机&#xff0c;多一条NSS通信线。 &#xff08;2&#xff09;多主多从 SPI总线允许有多个主机和多个从机。 &#xff08;3&…

再见 ESNI,你好 ECH!—— ECH的前世今生

译者注&#xff1a;2024 年 9 月 25 日&#xff0c;Cloudflare 宣布再次推出 ECH 功能。借此契机&#xff0c;本人翻译了 Cloudflare 介绍 ECH 的博文 Good-bye ESNI, hello ECH! &#xff0c;以便科普ECH的发展历程。 现代互联网上的大多数通信都经过加密&#xff0c;以确保其…

Flink源码剖析

写在前面 最近一段时间都没有更新博客了&#xff0c;原因有点离谱&#xff0c;在实现flink的两阶段提交的时候&#xff0c;每次执行自定义的notifyCheckpointComplete时候&#xff0c;好像就会停止消费数据&#xff0c;完成notifyComplete后再消费数据&#xff1b;基于上述原因…

在Stable Diffusion WebUI中安装SadTalker插件时几种错误提示的处理方法

SD中的插件一般安装比较简单&#xff0c;但也有一些插件安装会比较难。比如我在安装SadTalker时&#xff0c;就遇到很多问题&#xff0c;一度放弃了&#xff0c;后来查了一些网上攻略&#xff0c;自己也反复查看日志&#xff0c;终于解决&#xff0c;不吐不快。 一、在Stable …

ElasticSearch高级功能详解与读写性能调优

目录 1. ES数据预处理 1.1 Ingest Node Ingest Node VS Logstash 1.2 Ingest Pipeline Pipeline & Processor 创建pipeline 使用pipeline更新数据 借助update_by_query更新已存在的文档 1.3 Painless Script Painless的用途&#xff1a; 通过Painless脚本访问字…

(17)MATLAB使用伽马(gamma)分布生成Nakagami-m分布的方法1

文章目录 前言一、使用伽马分布生成Nakagami分布随机变量的方法一二、MATLAB仿真代码后续 前言 MATLAB在R2013a版本中引入Nakagami分布对象&#xff0c;可以用来生成Nakagami随机变量。但是在更早的MATLAB版本中&#xff0c;并没有可以直接生成 Nakagami分布的随机变量的内置的…

C++之多态篇(超详细版)

1.多态概念 多态就是多种形态&#xff0c;表示去完成某个行为时&#xff0c;当不同的人去完成时会有不同的形态&#xff0c;举个例子在车站买票&#xff0c;可以分为学生票&#xff0c;普通票&#xff0c;军人票&#xff0c;每种票的价格是不一样的&#xff0c;当你是不同的身…

【JAVA开源】基于Vue和SpringBoot的旅游管理系统

本文项目编号 T 063 &#xff0c;文末自助获取源码 \color{red}{T063&#xff0c;文末自助获取源码} T063&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析5.4 用例设计 六、核…

【STM32开发之寄存器版】(二)-USART

一、前言 串口作为STM32的重要外设&#xff0c;对程序调试具有不可替代的作用。通用同步异步收发器(USART)提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的外部设备之间进行全双工数据交换。USART利用分数波特率发生器提供宽范围的波特率选择。其主要具备以下特性&am…

Nacos入门指南:服务发现与配置管理的全面解析

Nacos 是一个用于动态服务发现、配置管理和服务管理的平台。它由阿里巴巴开源&#xff0c;旨在帮助开发者更轻松地构建云原生应用。Nacos 支持多种环境下的服务管理和配置管理&#xff0c;包括但不限于 Kubernetes、Docker、虚拟机等。 一、Nacos的主要功能 1. **服务发现与健康…