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

[Linux]从零开始的STM32MP157 Busybox根文件系统测试及打包

一、前言

        在上一篇教程中,我们成功编译了Busybox根文件系统并且能够正常使用,但是大家应该也发现了我们构建的根文件系统存在许多问题,比如一些找不到文件的报错。并且在实际的产品中一般都是将根文件系统烧录到EMMC中,并不是像我们这样从网络挂载,那么本次教程就来教大家如何完善我们使用Busybox构建的根文件系统并且将其打包烧录到EMMC中,如果你准备好了就让我们开始吧!

二、谁适合本次教程

        因为本次教程是对我们前面基于Busybox编译好的根文件系统的一个完善,所以,在阅读本次教程之前还请参考前面编译的教程,毕竟编译好了才能进行下面的操作嘛。本次教程使用的是正点原子的STM32MP157开发板,如果你的开发板和我不同也可以将本次教程作为参考。

三、资料的准备

        本次教程中所使用的资料同样来自于正点原子提供的STM32MP157资料,下载的方式在交叉编译环境搭建时就已经讲过了,如果你还不知道如何下载资料,请看下面的教程:

STM32MP157编译环境搭建:[Linux]从零开始的STM32MP157交叉编译环境配置-CSDN博客

资料下载完成以后如下图所示:

本次教程会使用到“STM32CubeProgrammer”来为STM32MP157烧录系统,如果你之前没有安装请先安装好,如果你不知道如何使用可以考虑查看正点原子的官方文档教程。

四、Busybox根文件系统完善

        之前我们也只是将根文件系统构建好了,但是在我们的根文件系统在启动时还有一行报错,如图所示:

现在我们就来分析并且解决这个报错,首先我们来看报错信息,这里为了方便我就直接将报错复制过来了:

can't run '/etc/init.d/rcS': No such file or directory

这里的报错大概意思就是在运行时没有找到位于“/etc/init.d”下的名为“rcS”的文件。

这里我们可以直接使用下面的命令在“/etc/init.d”中新建一个名为“rcS”的文件,因为使用了nfs进行文件挂载,所以不管我们是在开发板的终端中新建文件还是在Ubuntu的终端中新建文件其实都是一样的,最终文件都是同步的,但是为了方便我们还是在Ubuntu中进行,这里我们首先进入Ubuntu中用户目录下的linux目录再进入“nfs/rootfs”目录,如下图所示:

这里我们在rootfs目录下使用下面的命令来创建“init.d”文件:

mkdir -p ./etc/init.d/

然后使用下面的命令来创建“rcS”文件:

touch ./etc/init.d/rcS

创建完成以后使用下面的命令打开“rcS”文件:

nano ./etc/init.d/rcS

打开以后如图所示:

然后我们将下面的内容复制到“rcS”中:

#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:$PATH
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib
export PATH LD_LIBRARY_PATH
mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s

完成以后如图所示:

这里为了解决windows和Linux换行符不同的问题,我们使用下面的命令安装一下换行符的转换工具:

sudo apt install dos2unix

安装完成以后,我们直接使用下面的命令调用这个工具转换换行符:

dos2unix ./etc/init.d/rcS

完成以后如图所示:

然后我们使用下面的命令给予“rcS”文件访问权限避免文件无法读取的问题:

chmod 777 ./etc/init.d/rcS

当我们完成对“rcS”文件的配置后,我们就可以重启一下我们的开发板,重启以后,重新进入根文件系统又会发现被提示找不到“/etc”下的“fstab”文件:

这里我们直接使用下面的命令在“etc”目录下新建“fstab”文件:

touch ./etc/fstab

新建好以后,在“fstab”中写入下面的内容:

#<file system>  <mount point>   <type>  <options>   <dump>  <pass> 
proc            /proc           proc    defaults    0       0
tmpfs           /tmp            tmpfs   defaults    0       0
sysfs           /sys            sysfs   defaults    0       0

完成以后如图所示:

写入完成以后,我们这里同样使用换行符转换工具处理一下“fstab”文件:

dos2unix ./etc/fstab

完成以后,我们再次重启开发板,可以看到又提示不能创建文件:

这是Linux内核配置问题,后面会讲怎么修改。因为要动内核,可能比较麻烦,我们这里就先不进行操作了。这里我们还需要在“etc”目录下新建一个名为“inittab”的文件,然后写入下面的内容:

#etc/inittab 
::sysinit:/etc/init.d/rcS 
console::askfirst:-/bin/sh 
::restart:/sbin/init 
::ctrlaltdel:/sbin/reboot 
::shutdown:/bin/umount -a -r 
::shutdown:/sbin/swapoff -a 

这里我们同样使用换行符工具来转换一下换行符:

dos2unix ./etc/inittab

现在我们来解决一下上面提到的由于内核配置引发的问题,这里我们直接来到内核的源码目录中,如图所示:

在linux的源码目录下使用下面的命令打开图形化配置界面:

make menuconfig

图形化配置界面启动以后如图所示:

这里我们首先找到“Device Drivers  ---> ”:

进入后找到“Generic Driver Options  ---> ”:

进入后我们将“Support for uevent helper  ”使能:

完成上面的步骤后我们将配置文件保存到原本的默认配置文件存放的地方:

./arch/arm/configs/stm32mp1_atk_defconfig 

完成以后,我们使用我们之前定义的构建脚本重新编译内核:

./build

编译完成以后如图所示:

编译完成以后,我们将位于Linux源码目录下的“arch/arm/boot”目录下的镜像拷贝到tftp目录,毕竟我们的Linux内核是使用tftp来传输的。

完成以后,我们再次重启开发板,这次开发板会拉取我们处理过的LInux内核,可以看到现在已经不报错了:

说明现在我们的根文件系统已经可以正常工作并且没有错误了。至此根文件系统就完善好了。

五、Busybox根文件系统功能测试

        在上面,我们已经将我们的根文件系统完善好了,现在我们就来对它的功能进行一些测试吧。

1.软件运行测试

        为了确保我们根文件系统的各种链接库没有问题,我们可以自己写一个简单的程序来测试一下,这里我们首先在用户的目录下的linux目录中新建一个名为TEST的文件夹,如图所示:

我们在这个TEST文件夹中新建一个名为“hello.c”的文件,并且写入下面的代码:

#include <stdio.h>int main(void)
{while(1){printf("hello world!\r\n");sleep(2);}return 0;
}

这里的程序非常简单就不过多解释了。

写入完成以后如图所示:

然后我们使用下面的命令来编译我们写好的.c文件:

arm-none-linux-gnueabihf-gcc hello.c -o hello

这里编译可能出现警告,我们不用管:

这里我们可以使用file命令来查看一下我们这个文件的架构:

file hello

可以看到我们这里的文件架构是ARM的,毕竟我们是使用交叉编译器来编译的嘛:

然后我们在rootfs目录下新建一个名为“drivers”的目录,然后将我们编译出来的可执行文件复制到其中,后面如果要学习Linux驱动开发的话,也会将写好的驱动放在“drivers”目录中:

cp ./hello /home/chulingxiao/linux/nfs/rootfs/drivers/

然后使用下面的命令开放这个可执行文件的权限:

chmod 777 hello

然后我们在开发板一侧切换到dev目录,运行这个可执行文件,效果如图:

这里可以看到我们的程序正常运行,没有提示依赖库找不到之类的说明我们构建的根文件系统的依赖库是完整的。

2.中文字符测试

        我们在编译Busybox之前已经对Busybox的源码进行了修改,保证了Busybox支持中文,现在我们来测试一下。这里我们直接在Ubuntu一侧直接使用下面的命令在rootfs目录中新建一个中文文件,使用下面的命令:

touch 中文测试.txt

完成后如图所示:

我们可以在这个文本文件中写入一些中文内容:

然后我们来到开发板一侧,看看文件会不会正常显示,这里可以看到,在开发板的终端中这个中文测试文件是正常显示的:

然后我们再使用“cat”命令将文件中的内容打印出来:

可以看到,在我们基于Busybox构建的根文件系统中,中文显示是正常的,说明我们的中文功能没有问题。

3.ping命令测试

        因为我这里的联网方式并没有采用像正点原子教程中的那样使用路由器,所以肯定就无法ping通外网,我们这里就只ping我们的服务器即可,ping命令很简单,就不多说了:

可以看到,我们是可以正常Ping到我们的服务器的,说明我们的ping命令和网络都没有问题。

至此,对于Busybox根文件系统的基本测试就完成了。

六、Linux内核及根文件系统打包

        在我们的实际产品或者项目中,我们的Linux内核和根文件系统是不可能通过网络拉取的,所以非常必要的就是我们需要将Linux内核与根文件系统像Uboot一样烧录到EMMC中,然后由Uboot来拉起。所以现在就来教大家如何将我们的Linux内核与根文件系统打包然后烧录到EMMC中。

1.Linux内核打包与烧录测试

        这里我们先来打包Linux内核,之前我们构建完成的Linux内核其实就只有镜像和设备树文件两部分,这两部分被我们放在了tftp目录下以便Uboot可以直接拉取,我们可以直接找到:

这里的LInux镜像我们在上面已经替换成了我们新编译的镜像了,所以肯定是不会有问题的。

现在我们来进行打包,首先我们在用户目录下的linux目录下新建一个名为“bootfs”的目录:

mkdir bootfs

然后使用下面的命令进入这个名为“bootfs”的目录并且创建ext4磁盘:

cd bootfs 
dd if=/dev/zero of=bootfs.ext4 bs=1M count=10  
mkfs.ext4 -L bootfs bootfs.ext4 

完成上面的步骤后,我们可以看到在“bootfs”目录中已经有以“ext4”结尾的文件了:

然后我们我们使用下面的命令新建一个文件并且挂载我们创建出来的ext4磁盘:

sudo mkdir /mnt/bootfs 
sudo mount bootfs.ext4 /mnt/bootfs/ 

完成以后,我们将Linux系统镜像和设备树文件拷贝到这个挂载点中:

sudo cp /home/chulingxiao/linux/tftp/* /mnt/bootfs/

文件拷贝完成以后,我们使用下面的命令将这个ext4磁盘卸载:

sudo umount /mnt/bootfs 

卸载完成以后,我们的Linux内核的打包就完成了,我们的Linux镜像和设备树文件都放在了这个ext4磁盘文件中,我们现在就可以将这个名为“bootfs.ext4”的文件烧录到开发板的EMMC中。

这里我们可以将原本烧录Uboot时使用的烧写脚本文件复制出来,相关的uboot与tf-a我们都沿用之前的。如图:

这里我们将文件夹的名字修改为“stm32mp157_bootfs”,将烧写脚本文件名修改为“bootfs.tsv”,如图所示:

这里我们直接将我们制作好的Linux内核打包文件复制过来,如图所示:

这里我们还需要修改一下tsv文件,因为这个文件之前是用作烧录Uboot,我们需要在它的最下面加上这样一行内容它才能烧录我们准备的.ext4文件:

P		0X21	boot	System		mmc1	0x00280000	bootfs.ext4

完成后如图所示:

#Opt	Id		Name		Type		Device	Offset		Binary
-		0x01	fsbl1-boot	Binary		none	0x0			tf-a-stm32mp157d-atk-serialboot.stm32
-		0x03	ssbl-boot	Binary		none	0x0			u-boot.stm32
P		0x04	fsbl1		Binary		mmc1	boot1		tf-a-stm32mp157d-atk-trusted.stm32
P		0x05	fsbl2		Binary		mmc1	boot2		tf-a-stm32mp157d-atk-trusted.stm32
P		0x06	ssbl		Binary		mmc1	0x00080000	u-boot.stm32
P		0X21	boot	System		mmc1	0x00280000	bootfs.ext4

这里我们使用"STM32CubeProgrammer"打开烧录脚本:

然后我们将开发板的拨码都拨到0,按下复位后刷新USB设备:

这些都是非常基础的操作,现在就不细讲了。

检测到USB后,我们链接后点击“Download”即可,随后就开始了下载:

出现下面这样的提示下载就已经完成了:

下载完成以后我们将开发板的拨码拨到原本的位置也就是用EMMC启动,我们再次复位开发板,然后进入Uboot中,我们这里还需要Uboot中配置环境变量来拉起Linux内核,这里我们直接使用下面的命令来配置相关的环境变量:

setenv bootcmd 'ext4load mmc 1:2 c2000000 uImage;ext4load mmc 1:2 c4000000 stm32mp157d-atk.dtb;bootm c2000000 - c4000000'  

然后使用下面的命令保存环境变量:

saveenv

保存完成以后,我们输入下面的命令来启动我们的Linux内核:

boot

输入了“boot”命令以后,可以看到我们的Uboot并没有再去网络拉取Linux内核了,而是从EMMC直接启动:

这也说明了我们的Linux内核打包是成功的。

至于最下面的报错也是因为内核没有找到根文件系统:

不过不影响,我们的根文件系统本来就没烧录进去嘛。

至此Linux内核的打包与烧录就完成了。

2.根文件系统的打包与烧录

        烧录完Linux内核以后,现在我们可以来烧录根文件系统,首先还是对根文件系统的打包,这里我们同样的首先在用户目录下的linux目录下新建一个名为“rootfs”的文件夹:

然后使用下面的命令创建ext4磁盘:

cd rootfs 
dd if=/dev/zero of=rootfs.ext4 bs=1M count=1024 
mkfs.ext4 -L rootfs rootfs.ext4   

完成以后如图所示:

这里我们同样新建一个文件夹来挂载我们新建的ext4磁盘:

sudo mkdir /mnt/rootfs 
sudo mount rootfs.ext4 /mnt/rootfs/

完成后我们将我们原本在nfs目录下的rootfs目录下的所以文件都复制到我们挂载的目录中:

sudo cp /home/chulingxiao/linux/nfs/rootfs/* /mnt/rootfs/ -drf

拷贝完成以后,我们使用下面的命令卸载磁盘:

sudo umount /mnt/rootfs

这样我们的ext4磁盘制作就已经完成了:

现在我们来将这个ext4磁盘文件烧录到我们开发板的EMMC中,这里我们直接借用烧录Linux内核的脚本文件,我们将外层文件夹名字改为“stm32mp157_rootfs”,烧录脚本文件名字改为“rootfs.tsv”如下图所示:

 这里我们同样需要将制作好的ext4文件复制过来,如图所示:

这里我们还需要在烧录脚本的最后一行加上下面的内容:

P		0X22	rootfs	FileSystem		mmc1	0x04280000	rootfs.ext4

完成后如图所示:

#Opt	Id		Name		Type		Device	Offset		Binary
-		0x01	fsbl1-boot	Binary		none	0x0			tf-a-stm32mp157d-atk-serialboot.stm32
-		0x03	ssbl-boot	Binary		none	0x0			u-boot.stm32
P		0x04	fsbl1		Binary		mmc1	boot1		tf-a-stm32mp157d-atk-trusted.stm32
P		0x05	fsbl2		Binary		mmc1	boot2		tf-a-stm32mp157d-atk-trusted.stm32
P		0x06	ssbl		Binary		mmc1	0x00080000	u-boot.stm32
P		0X21	boot	System		mmc1	0x00280000	bootfs.ext4
P		0X22	rootfs	FileSystem		mmc1	0x04280000	rootfs.ext4

这里我们同样使用“STM32CubeProgrammer”来进行烧录,烧录方式和上面烧录Linux内核是一样的,这里就不多说了,都是重复很多次的操作了。烧录完成以后我们再次进入Uboot中,使用下面的命令配置相关环境变量:

setenv bootargs 'console=ttySTM0,115200 root=/dev/mmcblk2p3 rootwait rw'

配置完成以后使用下面的命令保存环境变量:

saveenv

最后我们再次使用boot命令启动Linux内核,可以发现我们的内核和根文件系统都启动起来了:

至此,我们根文件系统的打包以及烧录就已经完成了。

七、结语

        在本次教程中,教了大家如何完善自己的根文件系统以及对根文件系统功能的测试,最后我们还将我们构建好的Linux内核以及根文件系统打包并且烧录到EMMC中,本次教程涉及到的内容比较多,但是在之前的教程中都讲过,大家如果遇到了问题可以去翻阅之前的一些教程,那么最后,感谢大家的观看!

 

相关文章:

[Linux]从零开始的STM32MP157 Busybox根文件系统测试及打包

一、前言 在上一篇教程中&#xff0c;我们成功编译了Busybox根文件系统并且能够正常使用&#xff0c;但是大家应该也发现了我们构建的根文件系统存在许多问题&#xff0c;比如一些找不到文件的报错。并且在实际的产品中一般都是将根文件系统烧录到EMMC中&#xff0c;并不是像我…...

【Pandas】pandas DataFrame eval

Pandas2.2 DataFrame Computations descriptive stats 方法描述DataFrame.abs()用于返回 DataFrame 中每个元素的绝对值DataFrame.all([axis, bool_only, skipna])用于判断 DataFrame 中是否所有元素在指定轴上都为 TrueDataFrame.any(*[, axis, bool_only, skipna])用于判断…...

考研408《计算机组成原理》复习笔记,第二章(2)数值数据的表示和运算(浮点数篇)

一、回顾定点数知识点 ——定点小数机器码表示 ——定点整数机器码表示 ——【原码】和【移码】的作用 二、浮点数表示 1、概念引入 我们生活中有很多 “带小数”&#xff0c;也就是浮点数&#xff0c;也就是【整数部分】和【纯小数部分】都不为0&#xff0c;那么这样的小数…...

【虚幻引擎】UE5独立游戏开发全流程(商业级架构)

本套课程我将会讲解一下知识 1.虚幻引擎的常用功能节点、模块包含但不限于动画模块、UI模块、AI模块、碰撞模块、伤害模块、背包模块、准心模块、武器模块、可拾取物品模块、死亡等模块。 2.整个游戏的设计思路&#xff08;游戏架构&#xff09;&#xff0c;本套教程讲解了如…...

大语言模型 08 - 从0开始训练GPT 0.25B参数量 - MiniMind 单机多卡 torchrun deepspeed

写在前面 GPT&#xff08;Generative Pre-trained Transformer&#xff09;是目前最广泛应用的大语言模型架构之一&#xff0c;其强大的自然语言理解与生成能力背后&#xff0c;是一个庞大而精细的训练流程。本文将从宏观到微观&#xff0c;系统讲解GPT的训练过程&#xff0c;…...

使用gitbook 工具编写接口文档或博客

步骤一&#xff1a;在项目目录中初始化一个 GitBook 项目 mkdir mybook && cd mybook git init npm init -y步骤二&#xff1a;添加书籍结构&#xff08;如 book.json, README.md&#xff09; echo "# 我的书" > README.md echo "{}" > bo…...

Mysql视图详解

文章目录 1、视图简介 && 前置准备2、基本crud语法3、检查选项&#xff08;with check option&#xff09;CASCADEDLOCAL总结 4、视图更新限定条件 1、视图简介 && 前置准备 视图 (View) 是一种虚拟存在的表。视图中的数据并不在数据库中实际存在&#xff0c;…...

leetcode 56. 合并区间

题目描述 代码&#xff1a; class Solution {struct Interval{int left;int right;Interval(int l0,int r0):left(l),right(r){}bool operator<(const Interval& rhs) const{return left<rhs.left;}};public:vector<vector<int>> merge(vector<vecto…...

Mac 环境下 JDK 版本切换全指南

概要 在 macOS 上安装了多个 JDK 后&#xff0c;可以通过系统自带的 /usr/libexec/java_home 工具来查询并切换不同版本的 Java。只需在终端中执行 /usr/libexec/java_home -V 列出所有已安装的 JDK&#xff0c;然后将你想使用的版本路径赋值给环境变量 JAVA_HOME&#xff0c;…...

【生活相关-日语-日本-东京-搬家后-引越(ひっこし)(3)-踩坑点:国民健康保险】

【生活相关-日语-日本-东京-搬家后-引越&#xff08;ひっこし&#xff09;&#xff08;3&#xff09;-注意点&#xff1a;国民健康保险】 1、前言2、情况说明&#xff08;1&#xff09;问题说明&#xff08;2&#xff09;情况说明&#xff08;1&#xff09;收到情况&#xff08…...

C++ asio网络编程(6)利用C11模拟伪闭包实现连接的安全回收

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、智能指针管理Session二、用智能指针来实现Server的函数1.start_accept()1.引用计数注意点2.std::bind 与异步回调函数的执行顺序分析 2.handle_accept1.异步…...

【视频】解决FFmpeg将RTSP转RTMP流时,出现的卡死、出错等问题

1、简述 如果不修改图像内容,可以使用FFmpeg命令来将RTSP转RTMP流。 SRS视频服务器就是这么干的,它没有使用FFmpeg接口,而是直接使用FFmpeg命令来转流。 但是在使用中,约到了一些问题,比如转流时卡死、转流出错等等,下面描述怎么解决这些问题 2、出错重启 在shell脚本…...

飞牛NAS本地部署开源TTS文本转语音工具EasyVoice与远程使用流程

文章目录 前言1. 环境准备2. Docker部署与运行3. 简单使用测试4. 安装内网穿透4.1 开启ssh连接安装cpolar4.2 创建公网地址 5. 配置固定公网地址总结 前言 本文主要介绍如何在fnOS飞牛云NAS使用Docker本地部署一款非常好用的开源TTS文本转语音工具EasyVoice&#xff0c;并结合…...

​​STC51系列单片机引脚分类与功能速查表(以STC89C52为例)​

​​1. 基本I/O端口​​ ​​端口​​​​引脚范围​​​​类型​​​​主要功能​​​​特殊说明​​​​P0​​P0.0~P0.7​​开漏双向I/O​​1. 通用I/O&#xff08;需外接上拉电阻&#xff09; 2. 数据总线&#xff08;D0-D7&#xff09; 3. 低8位地址总线&#xff08;A0-A…...

recvfrom和sendto函数中地址参数的作用

在 UDP 通信中&#xff0c;recvfrom 和 sendto 函数中的地址参数起着至关重要的作用。 以下是对这两个函数中地址参数的作用、所属方以及缺失地址时的后果的详细解释。 recvfrom 函数 int recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_add…...

运维职业发展思维导图

主要内容如下: 一、 初级入行阶段 这是职业生涯的起点,主要涉及基础技能的学习和实践。 Linux初学: 重点是学习Linux系统的基础命令和操作。IDC机房运维: 负责数据中心机房内设备的管理和日常维护工作。Helpdesk桌面运维: 提供桌面技术支持,帮助用户解决遇到的计算机软硬…...

【数据处理】Python对CMIP6数据进行插值——详细解析实现(附源码)

目录 Python对CMIP6数据进行插值一、引言代码概览思维导图 二、数据预处理三、数据区域裁剪四、插值&#xff08;一&#xff09; 垂直插值&#xff08;二&#xff09; 水平插值 五、保存插值好的文件六、文件合并与气候态计算七、代码优化技巧八、多线程处理九、全部代码 Pytho…...

worldquant rank函数

https://support.worldquantbrain.com/hc/en-us/community/posts/13869304934935-%E6%80%8E%E6%A0%B7%E7%90%86%E8%A7%A3rank%E5%87%BD%E6%95%B0 链接。进的话可以填我的邀请码JS34795我可以带你 现在学习rank函数 我们所说的做多和做空 首先&#xff0c;当我们讨论Long和S…...

工业4.0神经嫁接术:ethernet ip转profinet协议通信步骤图解

在现代工业自动化领域&#xff0c;不同品牌的设备和协议之间的兼容性问题一直是个挑战。我们的包装线项目就遇到了这样的难题&#xff1a;需要将Rockwell Allen-Bradley的EtherNet/IP伺服系统与西门子PLC的PROFINET主站进行无缝对接。为了解决这一问题&#xff0c;我们采用了et…...

数据库——数据操作语言DML

&#xff08;2&#xff09;数据操作语言DML 简称DML——Data Manipulation Language用来对数据库中表的记录进行更新关键字&#xff1a;insert,delete,update A、 插入表记录 向表中插入数据 格式&#xff1a;insert into 表名(字段1,字段2,字段3……) values(值1,值2,值3);…...

文件防泄密的措施有哪些?

文件防泄密措施需要从技术、管理和物理三个层面综合施策&#xff0c;以下为常见措施分类整理&#xff1a; 一、技术防护措施 华途加密技术 文件加密&#xff1a;使用AES、RSA等算法对敏感文件加密。 传输加密&#xff1a;通过SSL/TLS、VPN保障传输安全&#xff0c;禁止明文传…...

C++ Mac 打包运行方案(cmake)

文章目录 背景动态库梳理打包方案静态库处理动态库处理(PCL库)编译链接动态库后处理逻辑 批量信任 背景 使用C编写的一个小项目&#xff0c;需要打包成mac下的可执行文件&#xff08;免安装版本&#xff09;&#xff0c;方便分发给其他mac执行&#xff0c;需要把项目的动态库都…...

数学复习笔记 10

前言 我觉得数学的高分乃至满分属于那些&#xff0c;聪明&#xff0c;坚韧&#xff0c;勇敢&#xff0c;细致的人。我非常惭愧自己不是这样的人&#xff0c;我在生活中发现了这样的同学&#xff0c;和他们交流的时候我常常感到汗流浃背&#xff0c;因为他们非常扎实的基础知识…...

Oracle-相关笔记

Oracle Database Online Documentation 11g 连接 WinR sqlplus username/passwordhostname:port/service_namesqlplus user02/123456192.xxx:1521/orclsqlplus / as sysdba #SQL*Plus 終端编码使用UTF-8 chcp 65001#打开SQL*Plus程序 sqlplus /nolog#使用dba角色登录(用 1.…...

mac安装cast

背景 pycharm本地运行脚本时提示cast没有安装 问题原因 脚本尝试调用cast命令&#xff08;以太坊开发工具foundry中的子命令&#xff09;&#xff0c;但您的系统未安装该工具。 从日志可见&#xff0c;错误发生在通过sysutil.py执行shell命令时。 解决方案 方法1&#xf…...

CodeEdit:macOS上一款可以让Xcode退休的IDE

CodeEdit 是一款轻量级、原生构建的代码编辑器&#xff0c;完全免费且开源。它使用纯 swift 实现&#xff0c;而且专为 macOS 设计&#xff0c;旨在为开发者提供更高效、更可靠的编程环境&#xff0c;同时释放 Mac 的全部潜力。 Stars 数21,719Forks 数1,081 主要特点 macOS 原…...

opencv4.11编译Debug提示缺少python312_d.lib或python3*_d.lib的解决办法

前言 当我们编译OpenCV 4.11的时候可能会遇到提示缺少库文件&#xff0c;这个时候我们可以下载Python源码编译这个lib。 也可以下载我上传的版本&#xff08;python312_d.lib&#xff09;&#xff0c;但是如果是其他版本需要自己编译。编译步骤如下&#xff0c;大概几分钟搞定…...

html的鼠标点击事件有哪些写法

在HTML中&#xff0c;鼠标点击事件的实现方式多样&#xff0c;以下从基础语法到现代实践为您详细梳理&#xff1a; 一、基础写法&#xff1a;直接内联事件属性 在HTML标签内通过on前缀事件属性绑定处理函数&#xff0c;适合简单交互场景&#xff1a; <!-- 单击事件 -->…...

深度解析物理机服务器故障修复时间:影响因素与优化策略

一、物理机故障修复的核心影响因素 物理机作为企业 IT 基础设施的核心载体&#xff0c;其故障修复效率直接关系到业务连续性。故障修复时间&#xff08;MTTR&#xff09;受多重因素交叉影响&#xff1a; 1. 故障类型的复杂性 硬件级故障&#xff1a; 简单故障&#xff1a;内存…...

蓝桥杯 2024 C++国 B最小字符串

P10910 [蓝桥杯 2024 国 B] 最小字符串 题目描述 给定一个长度为 N N N 且只包含小写字母的字符串 S S S&#xff0c;和 M M M 个小写字母 c 1 , c 2 , ⋯ , c M c_1, c_2, \cdots, c_M c1​,c2​,⋯,cM​。现在你要把 M M M 个小写字母全部插入到字符串 S S S 中&…...

解密企业级大模型智能体Agentic AI 关键技术:MCP、A2A、Reasoning LLMs-docker MCP解析

解密企业级大模型智能体Agentic AI 关键技术&#xff1a;MCP、A2A、Reasoning LLMs-docker MCP解析 这里面有很重要的原因其中一个很其中一个原因是因为如果你使用docker的方式&#xff0c;你可以在虚拟环境下就类似于这个沙箱的这个机制可以进行隔离。这对于安全&#xff0c;…...

访问 Docker 官方镜像源(包括代理)全部被“重置连接”或超时

华为云轻量应用服务器&#xff08;Ubuntu 系统&#xff09; 遇到的问题是&#xff1a; &#x1f512; 访问 Docker 官方镜像源&#xff08;包括代理&#xff09;全部被“重置连接”或超时了&#xff0c;说明你这台服务器的出境网络对这些国外域名限制很严格&#xff0c;常见于华…...

前馈神经网络回归(ANN Regression)从原理到实战

前馈神经网络回归(ANN Regression)从原理到实战 一、回归问题与前馈神经网络的适配性分析 在机器学习领域&#xff0c;回归任务旨在建立输入特征与连续型输出变量之间的映射关系。前馈神经网络&#xff08;Feedforward Neural Network&#xff09;作为最基础的神经网络架构&a…...

RNN/LSTM原理与 PyTorch 时间序列预测实战

🕰️ RNN / LSTM 原理与 PyTorch 时间序列预测实战 在处理时间序列数据、语音信号、文本序列等连续性强的问题时,循环神经网络(RNN)及其改进版本 LSTM(长短期记忆网络)是最常见也最有效的模型之一。本文将深入讲解 RNN 和 LSTM 的核心原理,并通过 PyTorch 实现一个时间…...

Docker容器镜像与容器常用操作指南

一、镜像基础操作 搜索镜像 docker search <镜像名>在Docker Hub中查找公开镜像&#xff0c;例如&#xff1a; docker search nginx拉取镜像 docker pull <镜像名>:<标签>从仓库拉取镜像到本地&#xff0c;标签默认为latest&#xff1a; docker pull nginx:a…...

1:OpenCV—图像基础

OpenCV教程 头文件 您只需要在程序中包含 opencv2/opencv.hpp 头文件。该头文件将包含应用程序的所有其他必需头文件。因此&#xff0c;您不再需要费心考虑程序应包含哪些头文件。 例如 - #include <opencv2/opencv.hpp>命名空间 所有 OpenCV 类和函数都在 cv 命名空…...

测试--BUG(软件测试⽣命周期 bug的⽣命周期 与开发产⽣争执怎么办)

1. 软件测试的⽣命周期 软件测试贯穿于软件的整个⽣命周期&#xff0c;针对这句话我们⼀起来看⼀下软件测试是如何贯穿软件的整个⽣命周期。 软件测试的⽣命周期是指测试流程&#xff0c;这个流程是按照⼀定顺序执⾏的⼀系列特定的步骤&#xff0c;去保证产品质量符合需求。在软…...

基于大模型预测围术期麻醉苏醒时间的技术方案

目录 一、数据收集与处理(一)数据来源(二)数据预处理二、大模型构建与训练(一)模型选择(二)模型训练三、围术期麻醉苏醒时间预测(一)术前预测(二)术中动态预测四、并发症风险预测(一)风险因素分析(二)风险预测模型五、基于预测制定手术方案(一)个性化手术规划…...

QT6 源(101)阅读与注释 QPlainTextEdit,其继承于QAbstractScrollArea,属性学习与测试

&#xff08;1&#xff09; &#xff08;2&#xff09; &#xff08;3&#xff09;属性学习与测试 &#xff1a; &#xff08;4&#xff09; &#xff08;5&#xff09; 谢谢...

电池组PACK自动化生产线:多领域电池生产的“智能引擎”

在电池产业蓬勃发展的当下&#xff0c;电池组PACK自动化生产线凭借其高效、精准、智能的优势&#xff0c;成为众多电池生产领域的核心装备。它广泛适用于数码电池、工具电池、储能电池、电动车电池以及动力电池的生产&#xff0c;有力推动了相关产业的升级与发展。 数码电池领…...

生成式AI在编程中的应用场景:从代码生成到安全检测

引言 生成式AI正在深刻改变软件开发的方式&#xff0c;从代码编写到测试、文档和维护&#xff0c;AI技术正在为每个环节带来革命性的变革。本文将深入探讨生成式AI在编程中的主要应用场景&#xff0c;分析其优势与局限性&#xff0c;并展望未来发展趋势。 主要应用场景 1. 代…...

安全牛报告解读《低空经济发展白皮书(3.0)安全体系》

一、概述 《低空经济发展白皮书&#xff08;3.0&#xff09;安全体系》由粤港澳大湾区数字经济研究院&#xff08;IDEA研究院&#xff09;发布&#xff0c;旨在构建低空经济安全发展的系统性框架&#xff0c;解决规模化低空飞行中的安全挑战。核心目标是明确安全体系需覆盖的飞…...

“2W2H”分析方法

“2W2H”是一种常用的分析方法&#xff0c;它通过回答**What&#xff08;是什么&#xff09;、Why&#xff08;为什么&#xff09;、How&#xff08;怎么做&#xff09;、How much&#xff08;多少&#xff09;**这四个问题来全面了解和分析一个事物或问题。这种方法可以帮助你…...

【数据挖掘笔记】兴趣度度量Interest of an association rule

在数据挖掘中&#xff0c;关联规则挖掘是一个重要的任务。兴趣度度量是评估关联规则的重要指标&#xff0c;以下是三个常用的兴趣度度量&#xff1a;支持度、置信度和提升度。 支持度&#xff08;Support&#xff09; 计算方法 支持度表示包含项集的事务占总事务的比例&…...

ArcGIS Pro调用多期历史影像

一、访问World Imagery Wayback&#xff0c;基本在我国范围 如下图&#xff1a; 二、 放大到您感兴趣的区域 三、 查看影像版本信息 点击第二步的按钮后&#xff0c;便可跳转至World Imagery (Wayback 2025-04-24)的相关信息。 四 、点击上图影像版本信息&#xff0c;页面跳转…...

Web3.0:互联网的去中心化未来

随着互联网技术的不断发展&#xff0c;我们正站在一个新时代的门槛上——Web3.0时代。Web3.0不仅仅是一个技术升级&#xff0c;它更是一种全新的互联网理念&#xff0c;旨在通过去中心化技术重塑网络世界。本文将深入探讨Web3.0的核心概念、技术基础、应用场景以及它对未来的深…...

java17

1.常见API之BigDecimal 底层存储方式&#xff1a; 2.如何分辨过时代码&#xff1a; 有横线的代码表示该代码已过时 3.正则表达式之字符串匹配 注意&#xff1a;如果X不是单一字符&#xff0c;需要加[]中括号 注意&#xff1a;1.想要表达正则表达式里面的.需要\\. 2.想要表…...

游戏引擎学习第283天:“让‘Standing-on’成为一个更严谨的概念

如果同时使用多个OpenGL上下文&#xff0c;并且它们都有工作负载&#xff0c;GPU或GPU驱动程序如何决定调度这些工作&#xff1f;我注意到Windows似乎优先处理活动窗口的OpenGL上下文&#xff08;即活动窗口表现更好&#xff09;&#xff0c;挺有意思的…… 当多个OpenGL上下文…...

小白上手RPM包制作

目录 rpm常用命令 安装环境-Ruby 安装环境-fpm 关于服务器 打包-打包二进制工程 .fpm配置文件 打包-打没有文件的包 RPM 包微调 命令行参数 fpm --help RPM 签名 打包-制作NGINX的RPM包 关于rpmbuild 简单使用 打包之前的准备工作 rpmbuild 打包 - sniproxy …...

电商热销榜的5种实现方案

文章目录 1. MySQL 聚合查询&#xff1a;传统统计法2. Redis Sorted Set&#xff1a;内存排行榜3. Elasticsearch 实时聚合&#xff1a;搜索专家4. 缓存异步更新&#xff1a;榜单的幕后推手5. 大数据离线批处理&#xff1a;夜间魔法师 博主介绍&#xff1a;全网粉丝10w、CSDN合…...