嵌入式代码编译过程概述

嵌入式代码编译过程概述

  • 前言
  • 一、c/c++编译过程
    • 1.1 代码编译过程
      • 1.1.1 预处理
      • 1.1.2 编译阶段
      • 1.1.3 汇编阶段
      • 1.1.4 链接阶段
    • 1.2 编译过程中的编译工具
      • GCC /G++
      • clang/clang++
      • MinGW / MSVC
      • Arm GNU Toolchain
      • armcc
      • MAKE/CMAKE/qmake
  • 二、常见IDE编译过程
    • 2.1 keil代码编译过程
    • 2.2 windows-QT代码编译过程
    • 2.3 Linux-Cmake过程
  • 总结
  • 参考


前言

最近跨平台开发发现很多熟悉又陌生的名词出现了,比如gcc gun armcc make 动态库、静态库、链接等等。这次就是梳理总结一下防止后续遗忘。


一、c/c++编译过程

1.1 代码编译过程

代码由比较容易理解的if else变成0101二进制机器码主要经历四个过程:1. 预处理 2. 编译阶段 3. 汇编阶段 4. 链接阶段
在这里插入图片描述

1.1.1 预处理

在 C/C++ 中,预处理器指令以 # 号开头,比如 #include、#define 和 #if 等。在这一阶段,编译器逐个处理 C++源码文件,产生后缀.i文件。

  • 对于 #define 指令,编译器将源码中的宏替换成宏定义中的内容;
  • 对于 #if、#ifdef 和 #ifndef指令,编译器将有选择地跳过或选中部分源代码;
  • 而对于 #include指令,编译器将把对应的库的源码插入到当前源代码中——这通常是一些通用的声明。被 #include 指令引入的头文件( .h)往往会包含大量的代码,你引入的越多,最后生成的预编译文件就越大。
  • 预处理过程还会过滤掉所有注释/**/和//里面的内容。
  • 另外还会添加行号和文件名标识,使编译器能分辨出每一行来自哪个文件,以便在调试过程中能生成对应的错误信息。
  • 最后会保留#pragma编译器指令,因为编译器需要使用它们。如:#pragma once 是为了防止有文件被重复引用[1]。
    在这里插入图片描述
    还有下列几种预处理宏(是双下划线)

__LINE__ 表示正在编译的文件的行号
__FILE__表示正在编译的文件的名字
__DATE__表示编译时刻的日期字符串,例如: “11 July 2024”
__TIME__ 表示编译时刻的时间字符串,例如: “22:55:55”

1.1.2 编译阶段

编译阶段主要是实现高级编程语言转换为低级通用汇编语言的过程,此过程中还实现了语法分析、代码优化等,产生后缀.s文件。

1.1.3 汇编阶段

汇编阶段完成汇编语言到二进制机器码的转变。一份工程源码会有多个源码文件.c/.cpp等组成,因此会生成多个二进制机器码文件,叫做目标文件,以后缀.o/.obj命名。

目标文件由段组成,通常一个目标文件中至少有两个段:

  • 代码段:该段中所包含的主要是程序的指令。该段一般是可读和可执行的,但一般却不可写。
  • 数据段:主要存放程序中要用到的各种全局变量或静态的数据。一般数据段都是可读,可写,可执行的。

这一步生成的目标文件可以被放在被称为静态库的包中,以备后续使用——也就是说,如果你只修改了一个文件,你并不需要重新编译整个项目的源代码。

1.1.4 链接阶段

链接阶段就是把多个目标文件和外部引入的库按照调用过程组合成一份目标文件,也就是最终的可执行程序,后缀.out/.exe/.bin。

很多时候代码不是同一个人完成,或者说不同厂家为我们写好了一些驱动源码并打包编译留出了调用的接口方便我们开发,这部分就会用到外部库的引入。库的实际引入就在链接阶段,有两种类型的引入,一种是静态库(后缀.a/.lib)的引入,另一种是动态库(.so/.dll)的引入。
静态库的引入会将对应的二进制机器码文件复制合并到最终可执行文件中。优点可执行文件的执行不需要安装添加额外的库,交付时值交付可执行文件即可。缺点就是对应的可执行文件臃肿。
–静态库的链接–
在这里插入图片描述

动态库的引入就好比添加了快捷方式在最终的可执行文件中,可执行文件不再臃肿,简单轻巧,程序执行时在系统环境中调用外部库即可。优点是小巧,缺点便是可执行文件的执行依赖外部库,交付时除了可执行文件外还要给出依赖的库。不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例,规避了空间浪费问题。动态库在程序运行是才被载入,也解决了静态库对程序的更新、部署和发布页会带来麻烦。用户只需要更新动态库即可,增量更新。
–动态库的链接–
在这里插入图片描述

1.2 编译过程中的编译工具

嵌入式中常用的C/C++工具有Qt、Visual studio、Keil、IAR、Visual Studio Code (VSCode)等等,这些叫做集成开发环境(IDE-Integrated Development Environment),是一种工具包集合,集成了代码编辑器、代码编译套件、调试工具、下载工具、版本管理工具等等。IDE中与编译过程对应的就是一些代码编译套件。

C/C++常见的代码编译套件有GCC /G++、clang/clang++、MinGW / MSVC、Arm GNU Toolchain、ARMCC等,在套件基础上更高一层的是支持跨平台的构建工具MAKE及构建生成工具CMAKE/qmake等。

GCC /G++

介绍GCC/G++要先说一下GUN,GNU 是一个类 Unix 操作系统。它是由多个应用程序、系统库、开发工具乃至游戏构成的程序集合。GNU 的许多程序在 GNU 工程下发布,我们称之为 GNU 软件包。

GCC与G++都是在GUN下开发出来的工具,底层均为调用GNU编译器套件。GNU编译器套件包括 C、C++、 Objective-C、 Fortran、Java、Ada和Go语言前端,也包括了这些语言的库(如libstdc++,libgcj等)。GCC (GUN C Compiler )调用了GUN编译器套件中的C compiler(C 编译器),GCC 中的 (GUN C++ Compiler)调用了GUN编译器套件中的 C++ compiler(C++编译器)。

GCC的初衷是为 GNU 操作系统专门编写的一款编译器,支持的处理器架构: ARM、x86、x86-64、MIPS、PowerPC等,因此 GCC 通常是跨平台软件的编译器首选[2]。根据程序文件的后缀名,gcc 指令可以自行判断出当前程序所用编程语言的类别:

xxx.c:默认以编译 C 语言程序的方式编译此文件;
xxx.cpp:默认以编译 C++ 程序的方式编译此文件。
xxx.m:默认以编译 Objective-C 程序的方式编译此文件;
xxx.go:默认以编译 Go 语言程序的方式编译此文件;

虽然GCC也可以编译c++代码但是对C++的语法支持强度是不一样的,GCC不会自动链接 STL;在编译 C 文件时,可使用的预定义宏是比较少的。G++对.c的处理是按照,cpp来的,在链接阶段会自动连接C++的标准库STL;

总之GUN编译套件的这种集合打包性质使得在 Linux 甚至 Windows 上各种涉及开发环境配置,源码编译的地方,都离不开 gcc 和 g++。

clang/clang++

clang/clang++是LLVM 项目的一个子项目,LLVM 项目是一个模块化、可重用的编译器和工具链技术的集合。最初是伊利诺伊大学的一个研究项目,目的是提供一种现代的、基于SSA的编译策略,能够支持任意编程语言的静态和动态编译。

Clang 是一个“LLVM原生”的 C/C++/Objective-C 等语言的轻量级编译器,旨在提供惊人的快速编译、极其有用的错误和警告消息,并为构建优秀的源代码级工具提供平台。Clang静态分析器和Clang整洁是自动查找代码中错误的工具,也是可以使用Clang前端作为库来解析 C/C++ 代码的工具的很好的例子。Clang所具有的 编译速度快、内存占用小、兼容GCC 等优点使得很多工具都在使用它。

MinGW / MSVC

  • MinGW (Minimalist GNU for Windows)是一个可自由使用和自由发布的 Windows 特定头文件和使用 GNU工具集导入库的集合,允许在 Windows 平台生成本地的 Windows 程序而不需要第三方 C 运行时(C Runtime)库。运行时库:支持程序运行的基本函数的集合,一般是静态库 lib 或动态库 dll。可以理解为GUN编译套件在Windows下的优化版本,因为下边QT的编译过程发现MinGW调用了g++来处理C++源码。
  • MSVC,Microsoft Visual C/C++ Compiler) 就是微软(MS)的VC运行库,由微软开发的 VC运行时库,被Visual Studio IDE 所集成,因此使用VS时会附带MSVC编译器。Windows很多程序在编制的时候使用了微软的运行库,这将大大减少了软件的编码量,提高了兼容性。

MinGW 和 MSVC都是 Windows C/C++ 语言编译支持,配置环境时遇到两者择其一即可。

Arm GNU Toolchain

ARM 除了有自己的专用编译器之外,还维护了一套基于 GCC 的交叉编译工具链,被称为 Arm GNU Toolchain。

  • arm-none-eabi   用于编译 ARM 架构的裸机系统(包括 ARM Linux 的 boot、kernel,不适用编译Linux 应用 Application),所以不支持那些跟操作系统关系密切的函数,比如 fork,它使用的是 newlib这个专用于嵌入式系统的 C 库。这是目前我们编写 ARM 裸机程序时,使用最多的交叉编译工具链!
  • arm-none-linux-gnueabi-gcc: 用于交叉编译 ARM(32位)系统中所有环节的代码,包括裸机程序、u-boot、Linux kernel、filesystem和App应用程序。
  • arm-none-elf-gcc: 用于交叉编译 ARM MCU(32位)芯片,如 ARM7、ARM9、Cortex-M/R 芯片程序。
  • aarch64-linux-gnu: 针对于目标平台是 Linux 系统,用于交叉编译 ARMv8 64 位目标中的裸机程序、u-boot、Linux kernel、filesystem 和 App 应用程序。
  • arm-linux-gnueabihf: 针对于目标平台是 Linux 系统,用于交叉编译ARM(32位)系统中所有环节的代码,包括裸机程序、u-boot、Linux kernel、filesystem和 App 应用程序。
  • arm-eabi-gcc: 用于编译 ARM 架构的裸机系统,包括 ARM Linux 的 boot、kernel,不适用编译 Linux 应用 Application
  • aarch64-elf: 用于编译 ARM v8 64位架构的裸机系统,包括 ARM Linux 的 boot、kernel,不适用编译 Linux 应用 Application

armcc

arm 公司 开发的一款编译器,在2005年收购 KEIL 公司后,这块编译器就集成在KEIL IDE里面[3]。于5.06版本后停滞(AC5),不继续维护,其前端基于 Edison Design Group 。(arm 的第六代编译器,AC6基于clang)。Edison Design Group 是一家公司,靠卖产品给卖编译器的公司生存,它卖的是前端,包括 C++、Java 和 Fortran 前端,全世界几乎所有商用编译器,都会用这家公司的前端[4]。
keil的AC6和AC5编译工具链如下:
在这里插入图片描述

MAKE/CMAKE/qmake

编译 hello.c 非常简单,只需要 gcc hello.c就可以了。但当项目庞大起来后,每次都要用gcc命令逐个去编译时,就很容易混乱而且工作量大。
所以,GNU 发明了 make 这个工具软件,可以编写 makefile 文件来指定特定的项目构建过程,当项目一个文件的代码更改时,只需要重新 make 一下就可以了。但 make 依然有很多不足,比如

  • make 对于类 unix 系统是通用的,但对 windows 系统并不友好(不能跨平台);
  • 不同编译器的语法规则不同,编写的 makefile 语法如果适合 GCC 则不适合 MSVC。

CMake 是比 Make 更高一层的构建生成器,Make是编写对应编译器的 makefile 从而调用编译器实现编译,而 CMake 是写一份独立的 CmakeList.txt 文件,然后该文件会根据当前系统环境选择适合的构建生成器(如 VS 或者 make),然后将 CmakeList.txt 翻译为适合的文件,再进一步调用编译器进行项目构建。还有一点就是CMAKE是跨平台构建的强大工具,支持跨平台、多编译器,一份CmakeLists.txt通吃Windows、IOS、Linux、Android等等平台,便于开发维护[5],如下图所示
在这里插入图片描述

qmake是Qt的专属构建工具。Qt是为跨平台而生的IDE,因此具备专有的moc编译器(The Meta-Object Compiler)和uic编译器(User Interface Complier)完成代码编译。对应的便有了自己的MAKE构建工具qmake,根据Qt 工程文件(.pro)生成对应的makefile文件,然后通过调用make工具实现对编译器的调用编译源码生成目标可执行文件。qmake与cmake一样是makefile文件的生成工具,功能一致。在QT中可以使用cmake实现makefile的文件生成。

在这里插入图片描述

小小总结一下就是,两大编译器套件集合:GUN编译器套件集合与LLVM编译器套件集合,GUN完整方便,LLVM精巧速度快。LLVM衍生Clang/Clang++,GUN衍生出了通用型的GCC/G++,对Windows友好的MinGW ,对ARM友好的Arm GNU Toolchain等。还有一些专有公司平台会开发特有的编译器,如visual studio 的MSVC,ARM平台的ARMCC(基于 Edison Design Group)。在基础编译器的基础上又衍生出了MAKE构建生成器来应对庞大源码的编译,针对跨平台及项目级维护开发出现了更高一层的CMAKE与qmake构建生成器。
在这里插入图片描述

二、常见IDE编译过程

2.1 keil代码编译过程

keil所用到的编译工具位于软件安装目录D:\Keil_v5\ARM\ARMCC\bin中,其中armar.exe用于生成.lib库,armasm.exe 处理汇编源码, armcc.exe 处理C/C++源码,armlink.exe链接工具,fromelf.exe将elf格式文件转化为其它进制编码的文件。
在这里插入图片描述
keil代码的编译过程如下图所示
在这里插入图片描述
下边建立一个简单的工程进行说明:
建立一个简单的点灯工程
在这里插入图片描述
为方便说明简化output与listing配置生成的文件,取消所有的勾选
在这里插入图片描述
在这里插入图片描述
设置完成后,点击编译即可看到编译信息,如下图
在这里插入图片描述
对应的输出文件如下图
在这里插入图片描述
上图中后缀.d .o文件为调用armasm与armcc产生,.inp与.sct(分散加载文件,可定义变量及代码的地址空间分布)与链接器armlink的调用有关,armlink调用结束生成elf格式的.axf文件,调用fromelf.exe生成.hex文件,单片机的烧写可以直接使用.hex文件。

与完整的编译过程[预处理、编译、汇编、链接]相比这里好像直接编译成目标文件然后链接起来,实际上只是编译器打包做好了并没有显示整个过程而已。

2.2 windows-QT代码编译过程

用Windows下的Qt creator新建一个基本mainWindow的空工程
在这里插入图片描述
构建生成工具使用Qt自带的qmake.exe,编译用到的构建工具mingw的make.exe
在这里插入图片描述
点击编译或者运行按钮,在编译输出框可看到编译过程信息。如下图编译过程主要分为三大块:1-生成makefile 2-编译生成目标文件.o 3-链接生成可执行文件.exe

在这里插入图片描述
三部分展开如下:
a) 生成makefile文件有两步:先调用qmake工具将.pro文件转化为makefile文件,然后调用mingw32-make.exe将qmake生成的makefile转化为目标makefile.Debug和makefile.Release
在这里插入图片描述
在这里插入图片描述

b) 目标文件.o的生成可分为用户源码的编译与包含Q_OBJECT宏的类编译。
下图中用户源码编译可看出,先调用了uic.exe将界面文件.ui编译成可被依赖的头文件.h,然后调用g++(看吧,还是GUN的套件)将main.cpp/ mainwindow.cpp 编译成main.o/mainwindow.o。
元对象类的编译过程如下图中2的指示:调用g++将编译器目录下的dummy.cpp编译成可依赖的头文件moc_predefs.h,然后调用moc.exe将对应的mainwindow的类编译成moc_mianwindow.cpp,编译成.cpp源码后,便可以继续调用g++工具编译成目标文件moc_mianwindow.o。
在这里插入图片描述

c) 最后一步就是将目标文件.o链接起来生成最终的可执行文件.exe。下图可看出是用了g++将main.o/mainwindow.o/moc_mainwindow.o以及各种.a结尾的和lib目录下的库链接起来生成最终的可执行文件untitled.exe。
在这里插入图片描述

2.3 Linux-Cmake过程

在linux下使用cmake和make工具完成简单hello word的输出[6]。

  1. 安装cmake工具
sudo apt install cmake
  1. 在hello文件夹下建立编译输出的文件夹out、CMakeListst.txt、hello.c hello.h main.c等文件,目录格式及内容如下
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  1. 进入out目录下,并执行cmake ../,编译结果如下
    在这里插入图片描述
    cmake主要是检测系统中的编译器,并生成make工具需要的Makefile文件。实际out目录中生成文件除了cmake临时文件外就是我们需要的Makefile文件。
    在这里插入图片描述
  2. 继续在out目录下执行make编译生成可执行文件
    在这里插入图片描述
    上图中可看出,执行过程:编译输出目标文件main.c.o和hello.c.o到hello.dir目录下;链接main.c.o hello.c.o生成hello可执行文件。
    在这里插入图片描述
  3. 执行hello程序,查看结果。
    在这里插入图片描述

总结

代码变成嵌入式芯片运行的机器码主要经历四个过程:1. 预处理 2. 编译阶段 3. 汇编阶段 4. 链接阶段,四个过程由编译器(gcc/g++等)实现,为方便编译过程,编译器的调用由构建工具(make)实现。构建工具的执行依赖对应的构建文件(makefile等),因此更进一步的自动化的处理将构建文件(makefile等)的生成由构建生成工具(cmake/qmake等)实现。

搞嵌入式越做会越接近底层,久了就会有一种感觉以前习以为常的东西会越来越带来疑惑。以前不知道什么是编译器,代码如何编译成二进制机器码,各个IDE都有啥区别,但是照样熟练点灯,对着各种外设疯狂输出。后来随着操作系统的引入、芯片的替换开发、开发软件的更迭,更底层总线驱动的开发等等,越来越疑惑代码是怎么编译跑到板子上的,一些莫名其妙的问题便很容易出现,甚至如何解决也不得其理。其实简单想一下就是正常的学习过程,经历了最初的认知理解层面后就是强化深入的过程,这时候前边没有打好的基础就显现出来了,所以你会越来越困惑以前注意不到又很重要的点。

参考

  1. 一段C++代码的一生(C++代码编译过程详解)
  2. 梳理 gcc、clang、mingw、cmake
  3. 熟悉又陌生的arm 编译器详解
  4. ARM 之七 主流编译器(armcc、iar、gcc for arm、LLVM(clang))详细介绍[通俗易懂]
  5. 跨平台构建:CMake在多平台和多编译器下的应用
  6. cmake超详细入门教程

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Hot100】LeetCode—322. 零钱兑换

目录 题目1- 思路2- 实现⭐322. 零钱兑换——题解思路 3- ACM 实现 题目 原题连接:322. 零钱兑换 1- 思路 思路 其中 amount 是背包容量 ——> 其中 nums 数组代表的背包重量 2- 实现 ⭐322. 零钱兑换——题解思路 class Solution {public int coinChange(in…

2023 N1CTF-n1proxy

文章目录 参考rsa握手rust_proxy源码公匙交换和签名会话钥匙后续通信生命周期和裸指针代码审计漏洞点 libc-2.27.so大致思路(exp还有变化)调试exp泄露libc写free_hook执行命令exp 参考 https://github.com/Nu1LCTF/n1ctf-2023/tree/main/pwn/n1proxy ht…

算法学习day19

一、通过删除字母匹配到字符字典中的最大值 给你一个字符串 s 和一个字符串数组 dictionary ,找出并返回 dictionary 中最长的字符串,该字符串可以通过删除 s 中的某些字符得到。 如果答案不止一个,返回长度最长且字母序最小的字符串。如果…

数据库——单表查询

一、建立数据库mydb8_worker mysql> use mydb8_worker; 二、建立表 1.创建表 mysql> create table t_worker(department_id int(11) not null comment 部门号,-> worder_id int(11) primary key not null comment 职工号,-> worker_date date not null comment…

【多模态】CLIP-KD: An Empirical Study of CLIP Model Distillation

论文:CLIP-KD: An Empirical Study of CLIP Model Distillation 链接:https://arxiv.org/pdf/2307.12732 CVPR 2024 Introduction Motivation:使用大的Teacher CLIP模型有监督蒸馏小CLIP模型,出发点基于在资源受限的应用中&…

CTF-NSSCTF题单[GKCTF2020]

[GKCTF 2020]CheckIN 这道题目考察:php7-gc-bypass漏洞 打开这道题目,开始以为考察反序列化,但实际并不是,这里直接用$_REQUEST传入了参数便可以利用了。这里出现了一个eval()函数,猜测考察命…

spring部分源码分析及Bean的生命周期理解

前言: 本文整体框架是通过refresh方法这个入口进入分析:分析IOC容器的创建及一些Bean的生命周期的知识点,写得确实一般般,感觉自己的有些前置知识并没有理解的很到位,所以,这篇文件先记录一下,…

MAT使用

概念 Shallow heap & Retained Heap Shallow Heap就是对象本身占用内存的大小。 Retained Heap就是当前对象被GC后,从Heap上总共能释放掉的内存(表示如果一个对象被释放掉,那会因为该对象的释放而减少引用进而被释放的所有的对象(包括…

CentOS 8中 更新或下载时报错:为仓库 ‘appstream‘ 下载元数据失败 : Cannot prepare internal mirrorlist

一、错误重现 CentOS Stream 8 - AppStream 0.0 B/s | 0 B 00:00 Errors during downloading metadata for repository appstream: - Curl error (6): Couldnt resolve host name for http://mirrorlis…

docker tomcat 404

HTTP 404状态码表示“Not Found”,即服务器无法找到请求的页面。 当用户尝试访问一个不存在的网页时,服务器会返回这个状态码。这个状态码是HTTP协议的一部分,用于告知客户端(通常是浏览器)服务器无法完成请求。404状…

设计模式13-单件模式

设计模式13-单件模式 写在前面对象性能模式典型模式1. 单例模式(Singleton Pattern)2. 享元模式(Flyweight Pattern)3. 原型模式(Prototype Pattern)4. 对象池模式(Object Pool Pattern&#xf…

软件测试最全面试题及答案整理(2024最新版)

目录 1、你的测试职业发展是什么? 2、你认为测试人员需要具备哪些素质 3、你为什么能够做测试这一行 4、测试的目的是什么? 5、测试分为哪几个阶段? 6、单元测试的测试对象、目的、测试依据、测试方法? 7、怎样看待加班问题 8、结合你以前的学习和工作经验&#xf…

34_YOLOv5网络详解

1.1 简介 YOLOV5是YOLO(You Only Look Once)系列目标检测模型的一个重要版本,由 Ultralytics 公司的Glenn Jocher开发并维护。YOLO系列以其快速、准确的目标检测能力而闻名,尤其适合实时应用。YOLOV5在保持高效的同时&#xff0c…

ForCloud全栈安全体验,一站式云安全托管试用 开启全能高效攻防

对于正处于业务快速发展阶段的企业,特别是大型央国企而言,日常的安全部署和运营管理往往横跨多家子公司,所面临的挑战不言而喻。尤其是在面对当前常态化的大型攻防演练任务时,难度更是呈“几何级数”上升: 合规难 众…

Linux中进程的控制

一、进程的创建 1、知识储备 进程的创建要调用系统接口&#xff0c;头文件 #include<unistd.h> 函数fork() 由于之前的铺垫我们现在可以更新一个概念 进程 内核数据结构&#xff08;task_struct, mm_struct, 页表....&#xff09; 代码 数据 所以如何理解进程的独…

最新 Docker 下载镜像超时解决方案:Docker proxy

现在Docker换源也下载失败太常见了&#xff0c;至于原因&#xff0c;大家懂得都懂。本文提供一种简洁的方案&#xff0c; 利用 Docker 的http-proxy&#xff0c;代理至本机的 proxy。 文章目录 前言Docker proxy 前言 这里默认你会安装 clash&#xff0c;然后有配置和数据库。…

华为云.云日志服务LTS及其基本使用

云计算 云日志服务LTS及其基本使用 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28550…

开机出现grub无法进入系统_电脑开机出现grub解决方法

最近有小伙伴问我电脑开机出现grub无法进入系统怎么回事&#xff1f;电脑开机出grub的情况有很多&#xff0c;电脑上安装了Linux和Win10双系统&#xff0c;但是由于格式化删除了Linux之后&#xff0c;结果win10开机了之后&#xff0c;直接显示grub&#xff1e;&#xff0c;无法…

平面五杆机构运动学仿真matlab simulink

1、内容简介 略 89-可以交流、咨询、答疑 2、内容说明 略 ] 以 MATLAB 程序设计语言为平台 , 以平面可调五杆机构为主要研究对象 , 给定机构的尺寸参数 , 列出所 要分析机构的闭环矢量方程 , 使用 MATLAB 软件中 SIMULINK 仿真工具 , 在 SIMULINK 模型窗口下建立数…