Keil中的gcc
文章目录
- 一、IDE背后的命令
- 1.1 IDE是什么
- 1.2 IDE的背后是命令
- 1.3 有两套主要的编译器
- 二、准备工作
- 2.1 arm-linux-gcc和gcc是类似的
- 2.2 Code::Blocks
- 2.2.1 设置windows环境变量
- 2.2.2 命令行示例
- 三、gcc编译过程详解
- 3.1 程序编译4步骤
- 3.2 gcc的使用方法
- 3.2.1 gcc使用示例
- 3.2.2 gcc常用选项
- 1.手工控制编译过程
- 2.使用后缀名决定编译过程
- 3.2.3 指定头文件目录
- 3.2.4 指定库文件
一、IDE背后的命令
1.1 IDE是什么
IDE指集成开发环境(Integrated Development Environment)。
我们开发STM32F103等单片机程序时使用是keil就是一种IDE。
使用IDE,很容易操作,点点鼠标就可完成:
- 添加文件
- 指定文件路径(头文件路径、库文件路径)
- 指定链接库
- 编译、链接
- 下载、调试
1.2 IDE的背后是命令
使用CMD来查看编译结果(这里使用第一个点灯程序为例):
如图勾上该选项:
用Note++查看生成的BAT文件:
用Note++分别查看main__i、start_ia、led_c_lnp,加上上图的编译语句:
打开CMD,进入到led.c的文件目录
进入到该文件目录下后复制上面红框内整合到一起的命令,可以看到其中的输出结果与Keil编译结果一样:
-
注意
- 使用GitBash执行命令的话
由于GitBash采用类似Linux的文件路径表示方法(比如 /d/abc,而非 d:\abc),命令行中windows格式的路径名要加上双引号,比如".\objects\main.o"
- 使用dos命令行执行命令的话
不需要加双引号
- 使用GitBash执行命令的话
-
在某个Keil工程所在目录下,打开Git Bash:
E:\ARM\doc_and_source_for_mcu_mpu\STM32MF103\daima\led_c
-
编译main.c
执行命令:"E:\keil5\ARM\ARMCC\Bin\ArmCC" --c99 --gnu -c --cpu Cortex-M3 -D__EVAL -g -O0 --apcs=interwork --split_sections -I.\RTE\_led_c -I"C:\Users\thisway_diy\AppData\Local\Arm\Packs\Keil\STM32F1xx_DFP\2.3.0\Device\Include" -I"C:\Keil_v5\ARM\CMSIS\Include" -D__UVISION_VERSION="527" -DSTM32F10X_HD -o ".\objects\main.o" --omf_browse ".\objects\main.crf" --depend ".\objects\main.d" "main.c"
-
编译start.S
执行命令:"E:\keil5\ARM\ARMCC\Bin\ArmAsm" --cpu Cortex-M3 --pd "__EVAL SETA 1" -g --apcs=interwork -I.\RTE\_led_c -I"C:\Users\thisway_diy\AppData\Local\Arm\Packs\Keil\STM32F1xx_DFP\2.3.0\Device\Include" -I"C:\Keil_v5\ARM\CMSIS\Include" --pd "__UVISION_VERSION SETA 527" --pd "STM32F10X_HD SETA 1" --list ".\listings\start.lst" --xref -o ".\objects\start.o" --depend ".\objects\start.d" "start.s"
-
链接
执行命令:"E:\keil5\ARM\ARMCC\Bin\ArmLink" --cpu Cortex-M3 ".\objects\main.o" ".\objects\start.o" --ro-base 0x08000000 --entry 0x08000000 --rw-base 0x20000000 --entry Reset_Handler --first __Vectors --strict --summary_stderr --info summarysizes --map --load_addr_map_info --xref --callgraph --symbols --info sizes --info totals --info unused --info veneers --list ".\Listings\led_c.map" -o ".\Objects\led_c.axf"
1.3 有两套主要的编译器
-
armcc
- ARM公司的编译器
- keil使用的就是armcc
-
gcc
- GNU工具链
- Linux等开源软件经常使用gcc
后面以GNU工具链为例讲解,所涉及的知识可以平移到armcc上。
二、准备工作
2.1 arm-linux-gcc和gcc是类似的
- arm-linux-gcc
- 给ARM芯片编译程序
- gcc
- 在x86编译程序
- 用法基本一样
- 为方便演示,我们使用gcc
- 为了方便在windows下演示,我们使用
Code::Blocks
- 它的安装程序自带gcc
2.2 Code::Blocks
它是一款基于GCC的windows IDE,可以用来开发C/C++/Fortran。
官网地址:http://www.codeblocks.org/
可以使用百问网韦东山老师提供的Git仓库下载:git clone https://e.coding.net/weidongshan/noos/cortexA7_windows_tools.git
下载GIT后,在apps目录下。
2.2.1 设置windows环境变量
在Path环境变量中添加:C:\Program Files\CodeBlocks\MinGW\bin
2.2.2 命令行示例
事先写好一个hello.c放在E盘,启动Git Bash,编译程序hello.c:
#include <stdio.h>int main(void)
{printf("hello, world!\n");return 0;
}
编译、运行命令如下:
gcc -o hello hello.c
./hello.exe
三、gcc编译过程详解
3.1 程序编译4步骤
我们经常使用“编译”泛指上面的4个步骤之一,甚至有时候会囊括这四个步骤。
3.2 gcc的使用方法
gcc [选项] 文件名
3.2.1 gcc使用示例
gcc hello.c // 输出一个名为a.out的可执行程序,然后可以执行./a.out
gcc -o hello hello.c // 输出名为hello的可执行程序,然后可以执行./hello
gcc -o hello hello.c -static // 静态链接gcc -c -o hello.o hello.c // 先编译(不链接)
gcc -o hello hello.o // 再链接
3.2.2 gcc常用选项
1.手工控制编译过程
选项 | 功能 |
---|---|
-v | 查看gcc编译器的版本,显示gcc执行时的详细过程 |
-o | 指定输出文件名为file,这个名称不能跟源文件名同名 |
-E | 只预处理,不会编译、汇编、链接t |
-S | 只编译,不会汇编、链接 |
-c | 编译和汇编,不会链接 |
一个c/c++文件要经过预处理、编译、汇编和链接才能变成可执行文件。
(1)预处理
C/C++源文件中,以“#”开头的命令被称为预处理命令,如包含命令“#include”、宏定义命令“#define”、条件编译命令“#if”、“#ifdef”等。预处理就是将要包含(include)的文件插入原文件中、将宏定义展开、根据条件编译命令选择要使用的代码,最后将这些东西输出到一个“.i”文件中等待进一步处理。
(2)编译
编译就是把C/C++代码(比如上述的“.i”文件)“翻译”成汇编代码。
(3)汇编
汇编就是将第二步输出的汇编代码翻译成符合一定格式的机器代码,在Linux系统上一般表现为ELF目标文件(OBJ文件)。“反汇编”是指将机器代码转换为汇编代码,这在调试程序时常常用到。
(4)链接
链接就是将上步生成的OBJ文件和系统库的OBJ文件、库文件链接起来,最终生成了可以在特定平台运行的可执行文件。
hello.c(预处理)->hello.i(编译)->hello.s(汇编)->hello.o(链接)->hello
详细的每一步命令如下:
gcc -E -o hello.i hello.c
gcc -S -o hello.s hello.i
gcc -c -o hello.o hello.s
gcc -o hello hello.o
上面一连串命令比较麻烦,gcc会对.c文件默认进行预处理操作,使用-c再来指明了编译、汇编,从而得到.o文件,
再将.o文件进行链接,得到可执行应用程序。简化如下:
gcc -c -o hello.o hello.c
gcc -o hello hello.o
我们事先写了一个hello.c,通过调用gcc指令查看编译细节:
#include <stdio.h>#define MAX 20
#define MIN 10 #define _DEBUG
#define SetBit(x) (1<<x) int main(int argc, char* argv[])
{printf("Hello World \n");printf("MAX = %d,MIN = %d,MAX + MIN = %d\n",MAX,MIN,MAX + MIN); #ifdef _DEBUGprintf("SetBit(5) = %d,SetBit(6) = %d\n",SetBit(5),SetBit(6));printf("SetBit( SetBit(2) ) = %d\n",SetBit( SetBit(2) ));
#endif return 0;
}
直接编译运行如下:
但此时我们输入以下命令会发现有所不同:
gcc -o hello hello.c -v
会发现出现了很多信息,但其中主要的是以下几条:
执行预处理命令:
gcc -E -o hello.i hello.c//预处理
可见对应的宏会被包含进来,同时define中的代码也会直接使用:
观察去掉define后的输出结果:
若在mian.c中输入其他错误代码,观察是否有报错现象:
执行编译命令:
gcc -S -o hello.s hello.i//编译
可见编译时会报错:
去除掉报错字符,观察结果:
可见删除之后编译通过,不会有报错。
执行汇编命令:
gcc -c -o hello.o hello.s
执行链接指令:
gcc -o hello hello.o
2.使用后缀名决定编译过程
参考《嵌入式Linux应用开发完全手册》
:
- 总结
- 输入文件的后缀名和选项共同决定gcc到底执行那些操作
- 在编译过程中,最后的步骤都是链接
- 除非使用了-E、-S、-c选项
- 或者编译出错阻止了完整的编译过程
3.2.3 指定头文件目录
头文件在哪里?
-
系统目录
-
系统目录在哪?工具链里的某个include目录
-
怎么确定?
echo 'main(){}'| gcc -E -v - // 它会列出头文件目录、库目录(LIBRARY_PATH)
-
可以不使用系统include目录吗?可以,编译时指定参数
-nostdinc
-
-
可以自己指定头文件目录
-I <头文件目录>
3.2.4 指定库文件
库文件在哪里?
-
系统目录
-
系统目录在哪?工具链里的某个lib目录
-
怎么确定?
echo 'main(){}'| gcc -E -v - // 它会列出头文件目录、库目录(LIBRARY_PATH)
-
可以不使用系统lib目录吗?可以,编译时指定参数
-nostdlib
-
-
可以自己指定库文件目录
-L <库文件目录>
- 指定库文件
-l <abc> // 链接 libabc.so 或 lib.a
相关文章:
Keil中的gcc
文章目录 一、IDE背后的命令1.1 IDE是什么1.2 IDE的背后是命令1.3 有两套主要的编译器 二、准备工作2.1 arm-linux-gcc和gcc是类似的2.2 Code::Blocks2.2.1 设置windows环境变量2.2.2 命令行示例 三、gcc编译过程详解3.1 程序编译4步骤3.2 gcc的使用方法3.2.1 gcc使用示例3.2.2…...
【Java数据结构】栈和队列相关算法
第一题:改变元素的序列 例1:若进栈序列为1,2,3,4,进栈过程中可以出栈,则下列不可能一个出栈序列(); A:1,4,3,…...
LoRA微调系列笔记
系列文章目录 第一章:LoRA微调系列笔记 第二章:Llama系列关键知识总结 第三章:LLaVA模型讲解与总结 文章目录 系列文章目录LoRA:Low-Rank Adaptation of Large Language Models目的:依据:优势:…...
Linux(Ubuntu)下ESP-IDF下载与安装完整流程(3)
接前一篇文章:Linux(Ubuntu)下ESP-IDF下载与安装完整流程(2) 本文主要看参考官网说明,如下: 快速入门 - ESP32-S3 - — ESP-IDF 编程指南 latest 文档 Linux 和 macOS 平台工具链的标准设置 - ESP32-S3 - — ESP-IDF 编程指南 latest 文档 一、安装准备 1. Linux用...
【C++】22___STL常用算法
目录 一、常用遍历算法 二、常用查找算法 2.1 find 2.2 其它查找算法 三、常用排序算法 3.1 sort 3.2 其它排序算法 四、拷贝 & 替换 4.1 copy 4.2 其它算法 五、常用的算数生成算法 5.1 accumulate 5.2 fill 六、常用集合算法 6.1 set_intersection 6…...
linux 批量替换文件指定字符串
启发:数据库连接串的用户名需要从sa修改为sasa find . -type f -name mssql.json -exec sed -i s/IDsa;/IDsasa;/g {}...
List接口(源码阅读)
文章目录 1.List接口常用方法1.代码2.结果 2.ArrayList底层机制1.结论2.ArrayList底层源码1.代码2.debug添加第一个元素1.进入2.elementData数组存储ArrayList的数据3.初始化为空数组4.首先确保使用size1来计算最小容量5.如果elementData为空,最小容量就是106.modCo…...
股市学习 seekingalpha tradingview
EMA EMA(Exponential Moving Average)是一种技术分析中常用的指标,用于平滑股价或其他资产价格的波动,以帮助分析价格走势的趋势和方向。EMA与简单移动平均(SMA)类似,但对最新价格的权重更大&a…...
用再生龙备份和还原操作系统(三)
续上篇《用再生龙备份和还原操作系统(二)》 三,用再生龙将镜像文件还原到硬盘 将再生龙工具盘、待还原系统的硬盘(与源盘一样大或更大)、镜像文件所在磁盘(如果是U盘,也可以后插)安…...
FaceFusion 从0开始本地部署,RTX4060
FaceFusion 从0开始本地部署指南 一、环境准备 1. 基础工具安装 1.1 Git 安装 使用管理员权限打开 PowerShell执行安装命令: winget install -e --id Git.Git验证安装: git --version1.2 FFmpeg 安装 使用管理员权限打开 PowerShell执行安装命令&…...
Swift Combine 学习(六):自定义 Publisher 和 Subscriber
Swift Combine 学习(一):Combine 初印象Swift Combine 学习(二):发布者 PublisherSwift Combine 学习(三):Subscription和 SubscriberSwift Combine 学习(四&…...
服务器网卡绑定mode和交换机的对应关系
互联网各领域资料分享专区(不定期更新): Sheet 模式类别 网卡绑定mode共有七种(0~6): bond0、bond1、bond2、bond3、bond4、bond5、bond6 mode详解 mode0 ,即:(balance-rr) Round-robin policy(平衡轮循环策略,需要配置交换机静态聚合) mode…...
【动手学轨迹预测】2.4 考虑地图拓扑关系的表征方法
上一节我们介绍了VectorNet提出了矢量化场景表征方法, 大幅提高了预测网络编码性能. 但是VectorNet对地图数据的编码是基于无向无权图的, 并没有考虑到地图的拓扑关系. 显然在预测中, 地图的拓扑关系应该被考虑到. 于是在VectorNet的基础上, LaneGCN提出一种将地图车道作为节点…...
ChatGLM3模型搭建(踩坑记录版)
参考 魔搭社区 https://zhuanlan.zhihu.com/p/720148240 智谱AI通用大模型:本地部署ChatGLM3-6B开源大模型 - 编程库 说明 搭建方式多篇文章结合着看; 模型下载强烈推荐魔塔社区下载ZhipuAI/chatglm3-6b; 官方github指定清华的模型没有…...
基于 Python Django 的花卉商城系统的研究与实现
博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…...
Spring Boot 3 文件下载、多文件下载以及大文件分片下载、文件流处理、批量操作 和 分片技术
在 Spring Boot 3 中,实现文件下载、多文件下载以及大文件分片下载需要结合以下功能:文件流处理、批量操作 和 分片技术。以下是详细实现方案: 1. 单文件下载 基础的单文件下载实现,可以参考以下代码: GetMapping(&…...
什么是事件循环(Event Loop)?请谈谈它在 JavaScript 中的作用?
事件循环(Event Loop)是什么? 事件循环(Event Loop)是JavaScript运行时环境(如浏览器或Node.js)中的一个核心机制,用于处理异步操作和事件。 它负责协调代码的执行、事件的处理、以…...
Lua : Coroutine(协程)
Lua 协程(coroutines)是一种强大的控制结构,允许函数在执行过程中暂停并在稍后恢复。与线程不同,协程是非抢占式的,这意味着它们不会被操作系统调度,而是由程序显式地切换。协程在 Lua 中非常有用ÿ…...
【2024华为OD-E卷-200分-跳格子2】(题目+思路+JavaC++Python解析)
题目描述 在一个二维平面上,有一个 n x m 的网格,每个格子有一个非负整数。你从左上角 (0, 0) 开始,每次只能向右或向下移动,目标是到达右下角 (n-1, m-1)。 在移动过程中,你需要记录经过的格子中,最大数…...
【仓颉语言基础】语言概念、环境配置与语法解析
华为仓颉语言是一门专为分布式系统设计的现代编程语言,以简洁的语法和强大的分布式能力为核心,提供高效的资源管理和任务调度方案。本篇文章将带您从概念入手,逐步掌握环境配置与语法基础,为分布式开发奠定坚实基础。 文章目录 一…...
LeetCode - 初级算法 数组(删除排序数组中的重复项)
免责声明:本文来源于个人知识与公开资料,仅用于学术交流。 删除排序数组中的重复项 这篇文章讨论如何从一个非严格递增的数组 nums 中删除重复的元素,使每个元素只出现一次,并返回新数组的长度。因为数组是排序的,只要是相同的肯定是挨着的,所以我们需要遍历所有数组,然…...
SpringMVC进阶(自定义拦截器以及异常处理)
文章目录 1.自定义拦截器 1.基本介绍 1.说明2.自定义拦截器的三个方法3.流程图 2.快速入门 1.Myinterceptor01.java2.FurnHandler.java3.springDispatcherServlet-servlet.xml配置拦截器4.单元测试 3.拦截特定路径 1.拦截指定路径2.通配符配置路径 4.细节说明5.多个拦截器 1.执…...
2 秒杀系统架构
第一步 思考面临的问题和业务场景 秒杀系统面临的问题: 短时间内并发非常高,如果按照秒杀的并发做相应的承载会造成大量资源的浪费。第二解决超卖的问题。 第二步 思考目前的处境和解决方案 因为秒杀系统属于短时间内的高并发问题,我们不可能使用那么…...
C++如何遍历数组vector
在C中,vector是一个可变数组。那么怎么遍历它呢?我们以for循环为例(while循环,大家自己脑补)。 方法一: 基于范围的for循环,这是C11新引入的。 std::vector<int> v {1, 2, 3, 4, 5, 6…...
ubuntu非root用户操作root权限问题-virbox挂在共享文件夹
首先讲一下,virtuallbox 挂在文件夹,操作的时候总是需要root权限,比较费劲。 这一操作其实也正对着我们在Ubuntu上的操作。 前段时间我想在ubuntu正常用户下去操作i2c,也出现了类似的问题。 后来把正常的操作加到组里面也解决了类…...
大模型推理:vllm多机多卡分布式本地部署
文章目录 1、vLLM分布式部署 docker镜像构建通信环境配置 2、其他大模型部署工具3、问题记录参考文献 单台机器GPU资源不足以执行推理任务时,一个方法是模型蒸馏量化,结果就是会牺牲些效果。另一种方式是采用多台机器多个GPU进行推理,资源不…...
WFP Listbox绑定数据后,数据变化的刷新
Listbox绑定数据通过ItemsSource来的,如果绑定的是普通的List<数据>,不会自己刷新。 使用ObservableCollection集合 解决问题的方法: 将数组替换为 ObservableCollection ObservableCollection 是专为绑定设计的集合类型,可以通知 W…...
AI + 爬虫:智能化数据采集的未来
随着人工智能(AI)技术的不断进步,传统的网络爬虫正经历一场前所未有的变革。从规则驱动到智能化演变,AI 的引入不仅提高了爬虫的效率和适应性,更为大规模数据采集提供了全新思路。本文将深入探讨 AI 与爬虫的结合&…...
人工智能知识分享第五天-正则化.损失函数案例
正则化 欠拟合与过拟合 过拟合:一个假设 在训练数据上能够获得比其他假设更好的拟合, 但是在测试数据集上却不能很好地拟合数据 (体现在准确率下降),此时认为这个假设出现了过拟合的现象。(模型过于复杂) 欠拟合:一个假设 在训…...
WebRTC的线程事件处理
1. 不同平台下处理事件的API: Linux系统下,处理事件的API是epoll或者select;Windows系统下,处理事件的API是WSAEventSelect,完全端口;Mac系统下,kqueue 2. WebRTC下的事件处理类: …...
C++软件设计模式之迭代器模式
迭代器模式是一种行为设计模式,它允许你顺序访问一个聚合对象的元素,而不暴露其底层表示。在C软件设计中,迭代器模式的主要目的是将数据的遍历行为与数据结构本身分离,使得数据结构的修改不会影响到遍历代码。 目的和意图 解耦遍…...
git reset --hard(重置到当前提交,所有未提交的更改都会被永久丢弃)
git reset --hard 是一个强大的命令,它会将你的工作目录、暂存区和当前分支的 HEAD 指针重置到指定的提交状态,所有未提交的更改都会被永久丢弃。因此,使用这个命令时需要非常小心。 基本用法 重置到当前提交(丢弃所有未提交的更…...
三分钟在你的react项目中引入tailwindcss
前言:在vite搭建的react项目中引入并使用tailwindcss 一、初始化react项目 1、创建项目 在文件夹下右键打开终端并输入命令使用vite创建项目 pnpm create vite react-tailwind选择reactjavascript,并输入命令安装依赖并启动 2、安装tailwind pnpm …...
Android Studio学习笔记
01-课程前面的话 02-Android 发展历程 03-Android 开发机器配置要求 04-Android Studio与SDK下载安装 05-创建工程与创建模拟器...
19712 数字接龙
/*我觉得重要的理解点:1.四维数组白表示一个点从另一个点沿对角线的方式进行移动,如果这个元素的值为真则表示这样的移动存在。 2.按照0->k-1的顺序移动。这个要求的实现方法也值得学习 3.count和index的含义: index表示索引,表…...
【图像去噪】论文复现:大道至简!ZS-N2N的Pytorch源码复现,跑通源码,获得指标计算结果,补充保存去噪结果图像代码,代码实现与论文理论对应!
请先看【专栏介绍文章】:【图像去噪(Image Denoising)】关于【图像去噪】专栏的相关说明,包含适配人群、专栏简介、专栏亮点、阅读方法、定价理由、品质承诺、关于更新、去噪概述、文章目录、资料汇总、问题汇总(更新中) 完整代码和训练好的模型权重文件下载链接见本文底…...
Linux-mac地址
mac地址 由6位16进制数组成。最高字节的最低位,0表示单播地址,1表示多播地址。最高字节的第二位,0表示全局地址,1表示本地地址。 单播地址:单播MAC地址用于一对一的通信模式,即从单一的源端发送到单一的目…...
旷视科技Java面试题及参考答案
讲一下进程间的通讯方式(如管道、消息队列、共享内存、Socket 等),各有什么特点? 管道(Pipe) 管道是最早出现的进程间通信方式之一,主要用于具有亲缘关系(父子进程)的进程之间通信。 特点: 半双工通信,数据只能单向流动。例如,在一个简单的父子进程通信场景中,父进…...
【无线传感网】WSN数据管理技术
文章目录 WSN数据管理的基本概念以数据为中心的WSN数据库与分布式数据库相比具有的特殊性WSN数据管理技术的研究热点 WSN数据管理的关键技术无线传感器网络数据存储结构网外集中式存储方案网内分层存储方案网内本地存储方案以数据为中心的网内存储方案 数据查询处理技术查询类型…...
硬件基础知识笔记(2)——二级管、三极管、MOS管
Part 2 二级管、三极管、MOS管 1、二级管1.1肖特基二极管和硅二极管选型比较1.2到底是什么决定了二极管的最高工作频率?1.3二极管结电容和反向恢复时间都是怎么来的 1、二级管 1.1肖特基二极管和硅二极管选型比较 肖特基二极管的优势主要在速度和压降,对…...
记录uniapp组件swiper自适应高度
在uniapp组件swiper不能自适应高度 思路: 根据传的图片,进行图片分析宽高, 根据屏幕尺寸,进行换算对应的宽高比。 最后获得图片尺寸,进行赋值。 <swiper class="swiper" :style="{ height: `${swiperheight}` + px }" @change="onSwiperC…...
Presto-简单了解-230403
presto是什么了解一下: 秒级查询引擎(不做存储),GB-PB级不依赖于yarn,有自己的资源管理和执行计划支持多种数据源:hive、redis、kafka presto架构 presto优缺点 presto优点 内存到内存的传输࿰…...
Windows Knowledge
1 GRUB简介 1.1 MBR和PBR MBR分为GRUB.MBR和DOS.MBR。 由于硬盘上扇区从偏移0到偏移62属于同一个磁道0,虽然DOS.MBR仅占用一个扇区,但是需要将DOS.MBR后面的偏移1到偏移62保留,所以磁盘上第一个分区的第一个扇区是从偏移63开始的。fbinst软件…...
【Rust自学】9.1. 不可恢复的错误以及panic!
喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 9.1.1. Rust错误处理概述 Rust拥有极高的可靠性,这也延伸到了错误处理的领域。比如说在大部分情况下,Rust会迫使你…...
UE5 Debug的一些心得
1、BUG粗略可分为两类: 一种是显性的,编译直接就通不过,必须马上解决。 第二种是隐性的,新功能完成后,编译成功顺利运行,洋洋自得,而问题隐藏在幕后,测试之后才逐渐发现有问题&…...
Docker Compose 构建 EMQX 集群 实现mqqt 和websocket
EMQX 集群化管理mqqt真香 目录 #目录 /usr/emqx 容器构建 vim docker-compose.yml version: 3services:emqx1:image: emqx:5.8.3container_name: emqx1environment:- "EMQX_NODE_NAMEemqxnode1.emqx.io"- "EMQX_CLUSTER__DISCOVERY_STRATEGYstatic"- …...
通过Xshell远程连接wsl2
目录 一、WSL网络原理 二、 下载XShell 三、Ubuntu里配置ssh 1.查看是否已经安装SSH 2.安装SSH 3.修改SSH配置 4.重启ssh 5.查看ip 四、在Xshell中链接电脑 五、设置端口转发 1.设置主机端口映射到wsl2的端口 六、防火墙设置开放8989端口 方式一(推荐): 方式二:…...
产品原型设计
🤣🤣目录🤣🤣 一、Axure原型设计(Axure RP 9 )1.1 软件下载安装1.2 产品原型展示1.3 产品原型下载1.4 视频课程推荐 二、磨刀原型设计2.1 软件下载安装2.2 产品原型展示2.3 产品原型下载2.4 视频课程推荐 什…...
【二】arcgis JavaScript api 实现加载不同坐标系的底图和三维服务
提示:如果是天地图底图参考这篇文章 【一】arcgis JavaScript api 实现加载不同坐标系的底图和三维服务_arcgis js api 调用三维地图服务-CSDN博客 需求: 前端开发实现底图(wkid:3857,web墨卡托)&#x…...
使用JMeter对Linux生产服务器进行压力测试
安装 JMeter wget https://downloads.apache.org/jmeter/binaries/apache-jmeter-5.4.1.tgz tar -xzf apache-jmeter-5.4.1.tgz cd apache-jmeter-5.4.1创建 JMeter 脚本 设置中文 选择Options—>Choose Language—>选择其他语言(例如:Chinese&am…...