自动化构建-make/Makefile 【Linux基础开发工具】

一、背景

• 会不会写makefile,从一个侧面说明了一个⼈是否具备完成大型工程的能力 • 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作 • makefile带来的好处就是⸺“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。 • make是一个命令#%#$#%@%@%$#%$#%#%#$%@_20dc++e2c6fa909a5cd62526615fe2788a,是一个解释makefile中指令的命令工具,一般来说,大多数的ide都有这个命令,比如:delphi的make,visual c++的nmake,linux下gnu的make。可见,makefile都成为了一种在工程方面的编译方法。 • make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。

二、Makefile编译过程

自动化构建-make/Makefile 【Linux基础开发工具】

Makefile文件中的命令有一定规范,一旦该文件编写好以后在Linux命令行中执行一条make命令即可自动编译整个工程。不同厂家的make可能会稍有不同,并且语法上也有区别,不过基本思想都差不多,主要还是落在目标依赖上,最广泛使用的是GNUmake。

2、语法规则

代码语言:javascript代码运行次数:0运行复制

目标 ... : 依赖 ...命令1命令2. . .

“Makefile的核心规则,类似于一位厨师做菜,目标就是做好一道菜,那么所谓的依赖就是各种食材,各种厨具等等,然后需要厨师好的技术方法类似于命令,才能作出一道好菜。   同时这些依赖也有可能此时并不存在,需要现场制作,或者是由其他厨师做好,那么这个依赖就成为了其他规则的目标,该目标也会有他自己的依赖和命令。这样就形成了一层一层递归依赖组成了Makefile文件。 Makefile并不会关心命令是如何执行的,仅仅只是会去执行所有定义的命令,和我们平时直接输入命令行是一样的效果。”

目标即要生成的文件。如果目标文件的更新时间晚于依赖文件更新时间,则说明依赖文件没有改动,目标文件不需要重新编译。否则会进行重新编译并更新目标文件。默认情况下Makefile的第一个目标为终极目标。依赖:即目标文件由哪些文件生成。命令:即通过执行命令由依赖文件生成目标文件。注意每条命令之前必须有一个tab(此文档编辑器默认是空格,复制下来的代码需要把命令代码的缩进改为tab制表符)保持缩进,这是语法要求。all:Makefile文件默认只生成第一个目标文件即完成编译,但是我们可以通过all 指定所需要生成的目标文件。 例如下面的例子:代码语言:javascript代码运行次数:0运行复制

all: target1 target2 target3target1:# 编译规则1target2:# 编译规则2target3:# 编译规则3

all被设置为第一个目标,并且target1、target2和target3被列为all的依赖。当你在命令行中运行make时,make命令会寻找并执行all目标规则,这将依次执行target1、target2和target3的编译规则。 因此,通过在Makefile中设置all作为默认目标规则,你可以简化构建过程,只需运行make命令即可执行整个编译过程,无需显式指定目标三、变量

符号表示取变量的值,当变量名多于一个字符时,使用”( )”

^ 表示所有的依赖文件 @ 表示生成的目标文件

代码语言:javascript代码运行次数:0运行复制

SRC = $(wildcard *.c)OBJ = $(patsubst %.c, %.o, $(SRC)) ALL: hello.out hello.out: $(OBJ)        gcc $< -o $@ %.o: %.c        gcc -c $< -o $@

四、变量赋值1、”=”是最普通的等号代码语言:javascript代码运行次数:0运行复制

在Makefile中容易搞错赋值等号,

使用 “=”进行赋值,变量的值是整个Makefile中最后被指定的值。

代码语言:javascript代码运行次数:0运行复制

VIR_A = AVIR_B = $(VIR_A) BVIR_A = AA

经过上面的赋值后,最后VIR_B的值是AA B,而不是A B,在make时,会把整个Makefile展开,来决定变量的值(类似于宏定义)

2、“:=” 表示直接赋值代码语言:javascript代码运行次数:0运行复制

赋予当前位置的值。

代码语言:javascript代码运行次数:0运行复制

VIR_A := AVIR_B := $(VIR_A) BVIR_A := AA

最后BIR_B的值是A B,即根据当前位置进行赋值。因此相当于“=”,“:=”才是真正意义上的直接赋值

3、“?=” 表示如果该变量没有被赋值,代码语言:javascript代码运行次数:0运行复制

赋值予等号后面的值。

代码语言:javascript代码运行次数:0运行复制

VIR ?= new_value

如果VIR在之前没有被赋值,那么VIR的值就为new_value。

代码语言:javascript代码运行次数:0运行复制

VIR := old_valueVIR ?= new_value

这种情况下,VIR的值就是old_value

4、”+=”和写代码是一样的,代码语言:javascript代码运行次数:0运行复制

表示将符号后面的值添加到前面的变量上

五、预定义变量

CC:c编译器的名称,默认值为cc。 cpp c预编译器的名称默认值为$(CC) -E

代码语言:javascript代码运行次数:0运行复制

CC = gcc

回显问题,Makefile中的命令都会被打印出来。如果不想打印命令部分 可以使用@去除回显

代码语言:javascript代码运行次数:0运行复制

@echo "clean done!"

六、函数通配符代码语言:javascript代码运行次数:0运行复制

SRC = $(wildcard ./*.c)

匹配目录下所有.c 文件,并将其赋值给SRC变量。

代码语言:javascript代码运行次数:0运行复制

OBJ = $(patsubst %.c, %.o, $(SRC))

这个函数有三个参数,意思是取出SRC中的所有值,然后将.c 替换为.o 最后赋值给OBJ变量。

示例:如果目录下有很多个.c 源文件,就不需要写很多条规则语句了,而是可以像下面这样写

代码语言:javascript代码运行次数:0运行复制

SRC = $(wildcard *.c)OBJ = $(patsubst %.c, %.o, $(SRC)) ALL: test.exe  #生成执行文件 test.exe: $(OBJ)        gcc $(OBJ) -o test %.o: %.c        gcc -c $< -o $@

这里先将所有.c 文件编译为 .o 文件,这样后面更改某个 .c 文件时,其他的 .c 文件将不在编译,而只是编译有更改的 .c 文件,可以大大提高大项目中的编译速度。

智谱AI开放平台 智谱AI开放平台

智谱AI大模型开放平台-新一代国产自主通用AI开放平台

智谱AI开放平台 85 查看详情 智谱AI开放平台 七、伪目标 .PHONY

伪目标只是一个标签,clean是个伪目标没有依赖文件,只有用make来调用时才会执行 当目录下有与make 命令 同名的文件时 执行make 命令就会出现错误。 解决办法就是使用伪目标

代码语言:javascript代码运行次数:0运行复制

SRC = $(wildcard *.c)OBJ = $(patsubst %.c, %.o, $(SRC)) ALL: test.exe test.exe: $(OBJ)        gcc $< -o $@ $(OBJ): $(SRC)        gcc -c $< -o $@ clean:        rm -rf $(OBJ) test.exe .PHONY: clean ALL通常也会把ALL设置成伪目标

八、其他常用功能代码清理clean

我们可以编译一条属于自己的clean语句,来清理make命令所产生的所有文件,列如

代码语言:javascript代码运行次数:0运行复制

SRC = $(wildcard *.c)OBJ = $(patsubst %.c, %.o, $(SRC)) ALL: test.exe test.exe: $(OBJ)        gcc $< -o $@ $(OBJ): $(SRC)        gcc -c $< -o $@ clean:        rm -rf $(OBJ) test.exe

九、嵌套执行Makefile

在一些大工程中,会把不同模块或不同功能的源文件放在不同的目录中,我们可以在每个目录中都写一个该目录的Makefile这有利于让我们的Makefile变的更加简洁,不至于把所有东西全部写在一个Makefile中。   列如在子目录subdir目录下有个Makefile文件,来指明这个目录下文件的编译规则。外部总Makefile可以这样写

代码语言:javascript代码运行次数:0运行复制

subsystem:            cd subdir && $(MAKE)其等价于:subsystem:            $(MAKE) -C subdir

定义$(MAKE)宏变量的意思是,也许我们的make需要一些参数,所以定义成一个变量比较有利于维护。两个例子意思都是先进入”subdir”目录,然后执行make命令   我们把这个Makefile叫做总控Makefile,总控Makefile的变量可以传递到下级的Makefile中,但是不会覆盖下层Makefile中所定义的变量,除非指定了 “-e”参数。   如果传递变量到下级Makefile中,那么可以使用这样的声明export   如果不想让某些变量传递到下级Makefile,可以使用unexport

代码语言:javascript代码运行次数:0运行复制

export variable = value等价于variable = valueexport variable等价于export variable := value等价于variable := valueexport variable如果需要传递所有变量,那么只要一个export就行了。后面什么也不用跟,表示传递所有变量

十、指定头文件路径

一般都是通过”-I”(大写i)来指定,假设头文件在:

代码语言:javascript代码运行次数:0运行复制

/home/develop/include

则可以通过-I指定:

代码语言:javascript代码运行次数:0运行复制

-I/home/develop/include

将该目录添加到头文件搜索路径中 在Makefile中则可以这样写:

代码语言:javascript代码运行次数:0运行复制

CFLAGS=-I/home/develop/include

然后在编译的时候,引用CFLAGS即可,如下

代码语言:javascript代码运行次数:0运行复制

yourapp:*.c    gcc $(CFLAGS) -o yourapp

十一、指定库文件路径

与上面指定头文件类似只不过使用的是”-L”来指定

代码语言:javascript代码运行次数:0运行复制

LDFLAGS=-L/usr/lib -L/path/to/your/lib

告诉链接器要链接哪些库文件,使用”-l”(小写L)如下:

代码语言:javascript代码运行次数:0运行复制

LIBS = -lpthread -liconv

十二、基本使用

实例代码

代码语言:javascript代码运行次数:0运行复制

#include  int main() {     printf("hello Makefile!n");     return 0;} 

Makefile文件

代码语言:javascript代码运行次数:0运行复制

myproc:myproc.cgcc -o myproc myproc.c.PHONY:cleanclean:rm -f myproc 

依赖关系 • 上面的文件myproc,它依赖myproc.c 依赖方法 • gcc -o myproc myproc.c ,就是与之对应的依赖关系 项目清理 • 工程是需要被清理的 • 像clean这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行,不过,我们可以显示要make执行。即命令⸺“make clean”,以此来清除所有的目标文件,以便重编译。 • 但是一般我们这种clean的目标文件,我们将它设置为伪目标,用 .PHONY 修饰,伪目标的特性是,总是被执行的。 • 可以将我们的 hello 目标文件声明成伪目标,测试一下。 什么叫做总是被执行?

代码语言:javascript代码运行次数:0运行复制

$ stat XXXFile: ‘XXX’Size: 987  Blocks: 8  IO Block: 4096  regular fileDevice: fd01h/64769d Inode: 1321125 Links: 1Access: (0664/-rw-rw-r--) Uid: ( 1000/ whb) Gid: ( 1000/ whb)Access: 2024-10-25 17:05:30.430619002 +0800Modify: 2024-10-25 17:05:25.940595116 +0800Change: 2024-10-25 17:05:25.940595116 +0800⽂件 = 内容 + 属性Modify: 内容变更,时间更新Change:属性变更,时间更新Access:常指的是⽂件最近⼀次被访问的时间。在Linux的早期版本中,每当⽂件被访问时,其atime都会更新。但这种机制会导致⼤量的IO操作。具体更新原则,不做过多解释。
自动化构建-make/Makefile 【Linux基础开发工具】

? 结论: .PHONY:让make忽略源文件和可执行目标文件的M时间对比

十三、推导过程代码语言:javascript代码运行次数:0运行复制

myproc:myproc.o gcc myproc.o -o myproc myproc.o:myproc.sgcc -c myproc.s -o myproc.omyproc.s:myproc.i gcc -S myproc.i -o myproc.smyproc.i:myproc.c gcc -E myproc.c -o myproc.i .PHONY:clean clean: rm -f *.i *.s *.o myproc

编译

代码语言:javascript代码运行次数:0运行复制

$ makegcc -E myproc.c -o myproc.igcc -S myproc.i -o myproc.sgcc -c myproc.s -o myproc.ogcc myproc.o -o myproc
自动化构建-make/Makefile 【Linux基础开发工具】

make是如何工作的,在默认的方式下,也就是我们只输入make命令。那么:

make会在当前目录下找名字叫“Makefile”或“makefile”的文件。如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到 myproc 这个文件,并把这个文件作为最终的目标文件。如果 myproc 文件不存在,或是 myproc 所依赖的后面的 myproc.o 文件的文件修改时间要比 myproc 这个文件新(可以用 touch 测试),那么,他就会执行后面所定义的命令来生成myproc 这个文件。如果 myproc 所依赖的 myproc.o 文件不存在,那么 make 会在当前文件中找目标为myproc.o 文件的依赖性,如果找到则再根据那一个规则生成 myproc.o 文件。(这有点像一个堆栈的过程)当然,你的C文件和H文件是存在的啦,于是 make 会生成 myproc.o 文件,然后再用 myproc.o 文件声明 make 的终极任务,也就是执行文件 hello 了。这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make根本不理。make只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起,我就不工作啦。十四、适度扩展语法代码语言:javascript代码运行次数:0运行复制

BIN=proc.exe  # 定义变量CC=gcc#SRC=$(shell ls *.c)   # 采⽤shell命令⾏⽅式,获取当前所有.c⽂件名SRC=$(wildcard *.c)   # 或者使⽤ wildcard 函数,获取当前所有.c⽂件名OBJ=$(SRC:.c=.o)   # 将SRC的所有同名.c 替换 成为.o 形成⽬标⽂件列表LFLAGS=-o   # 链接选项FLAGS=-c   # 编译选项RM=rm -f   # 引⼊命令$(BIN):$(OBJ)@$(CC) $(LFLAGS) $@ $^   # $@:代表⽬标⽂件名。 $^: 代表依赖⽂件列表@echo "linking ... $^ to $@"%.o:%.c # %.c 展开当前⽬录下所有的.c。 %.o: 同时展开同名.o@$(CC) $(FLAGS) $< # %<: 对展开的依赖.c⽂件,⼀个⼀个的交给gcc。@echo "compling ... $< to $@" # @:不回显命令.PHONY:cleanclean:$(RM) $(OBJ) $(BIN)   # $(RM): 替换,⽤变量内容替换它.PHONY:testtest:@echo $(SRC)@echo $(OBJ)

以上就是自动化构建-make/Makefile 【Linux基础开发工具】的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/739312.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
手机淘宝和淘宝特价版有什么区别?详细区别介绍?
上一篇 2025年11月25日 14:20:11
解决反转链表后只打印一个节点的问题
下一篇 2025年11月25日 14:20:15

相关推荐

  • 如何解决 Swoole 协程与异步 I/O 操作中的资源竞争问题

    在 swoole 中解决资源竞争问题的方法包括使用 channel 和锁机制。1. 使用 channel 协调协程间数据传递,确保数据有序性和安全性。2. 通过锁机制(如互斥锁、读写锁)保护共享资源访问,防止同时访问导致的竞争问题。 引言 在现代高并发编程中,Swoole 作为一个高性能的 PHP …

    2026年8月28日
    000
  • 夸克AI怎么处理PDF文档_夸克AI PDF解析与批注功能教程

    使用夸克AI可解析PDF并添加批注,先通过“文档”模块导入PDF,点击“用AI读文档”生成摘要与要点,长按文字选择高亮或批注并分类标签,批注汇总至笔记面板,最后导出PDF时可选包含AI解析内容与批注,支持本地保存或分享。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 Deep…

    2026年8月28日
    000
  • Linux 基本操作命令总结

    下面给大家总结介绍linux 基本操作命令,希望对需要的朋友有所帮助,更多linux使用教程请访问linux视频教程进行学习! Linux 基本操作命令 文件和目录管理 创建和删除 创建:mkdir 删除:rm 删除非空目录:rm -rf file 目录 删除日志 rm log (等价: $find…

    2026年8月28日
    000
  • 如何解决SymfonyAPI开发中的测试问题?使用lchrusciel/api-test-case可以!

    在 Symfony API 开发过程中,测试一直是个难题。我曾经在项目中遇到过这样的情况:需要为 JSON/XML API 进行高效的 TDD,但传统的测试方法效率低下,错误信息不够清晰,导致开发周期延长。幸运的是,我找到了 lchrusciel/api-test-case 这个库,它彻底改变了我的…

    用户投稿 2026年8月28日
    000
  • excel怎么学习_excel学习方法与入门进阶资源推荐

    掌握Excel需系统学习:先通过知名平台视频课打基础并实操,再结合官方文档与经典书籍深化函数与数据透视表等技能,同时参与实战项目提升应用能力,加入社区交流解惑,并利用交互式平台强化训练,逐步进阶。 如果您希望掌握Excel这一强大的数据处理工具,但不知从何入手或如何提升技能,则可以通过系统的学习方法…

    2026年8月28日
    300
  • 如何解决邮件发送中的复杂格式问题?使用Composer安装PEAR/Mail_Mime库可以帮你轻松搞定!

    可以通过以下地址学习 Composer:学习地址 在开发一个需要发送格式复杂邮件的项目时,我遇到了一个棘手的问题:如何在邮件中正确处理多种格式的内容,如附件、嵌入图片和html内容。这些问题导致邮件发送效果不佳,甚至无法正常发送。为了解决这个问题,我决定使用 composer 来安装 pear/ma…

    用户投稿 2026年8月28日
    300
  • Laravel 环境搭建与基础配置(Windows/Mac/Linux)

    在不同操作系统上搭建 laravel 环境的步骤如下:1. windows:使用 xampp 安装 php 和 composer,配置环境变量,安装 laravel。2. mac:使用 homebrew 安装 php 和 composer,安装 laravel。3. linux:使用 ubuntu …

    2026年8月28日
    100
  • Linux expect详解

    随处可见的expect 第一次见expect这个命令还是我第一次参加全量上线的时候,那是公司的一个牛人用Shell脚本写的一套自动部署、MD5 比对、发布的全量上线工具,没事的时候,看了下其中的几个脚本,好多的expect命令。实在是看不懂这个expect命令的用法,所以就找时间总结了这篇关于exp…

    2026年8月28日
    000
  • 如何清理浏览器缓存_各浏览器缓存清除指南

    清理浏览器缓存是指删除浏览器为加速网页加载而存储的临时文件,如图片、css、javascript等;2. 主要目的是解决网页显示错乱、加载旧内容等问题,并释放硬盘空间;3. 操作核心是进入浏览器设置或使用快捷键,选择清除数据类型时务必勾选“缓存的图片和文件”;4. 不同浏览器操作路径略有差异:chr…

    2026年8月28日
    000
  • 手把手教你们Python配置OpenCV环境,小白看一遍就会了

    手把手教你们Python配置OpenCV环境,小白看一遍就会了手把手教你们Python配置OpenCV环境,小白看一遍就会了手把手教你们Python配置OpenCV环境,小白看一遍就会了手把手教你们Python配置OpenCV环境,小白看一遍就会了

    ?️‍?1、简介?1.1、Opecv介绍 开课之前,我们先给大家讲讲opecv是一个基于bsd许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在linux、windows、android和mac os操作系统上。 [1] 它轻量级而且高效——由一系列 c 函数和少量 c++ 类构成,同时…

    2026年8月28日 用户投稿
    300
  • Spring Boot WebService服务发布失败:如何解决Jar包缺失导致的java.lang.NoClassDefFoundError异常?

    Spring Boot WebService部署失败:排查Jar包缺失问题 在Spring Boot中构建WebService服务时,部署和运行问题时有发生。本文分析一个常见的案例:“Spring Boot构建的WebService服务发布测试失败,提示找不到Jar包”。 问题描述: 运行程序时抛出…

    2026年8月28日
    000
  • 如何解决两步验证(2FA)备用代码问题?使用scheb/2fa-backup-code可以!

    可以通过一下地址学习composer:学习地址 在开发一个需要两步验证(2fa)的应用时,我遇到了一个棘手的问题:如何为用户提供备用代码功能,以便他们在无法使用主要验证方法时仍然能够登录。我尝试了多种方法,但效果都不理想,直到我发现了 scheb/2fa-backup-code 这个扩展库。 sch…

    用户投稿 2026年8月28日
    000
  • Yii 框架如何防范 SQL 注入攻击?

    在 yii 框架中,可以通过使用参数化查询来有效防范 sql 注入攻击。1) 使用 activerecord 或 query builder 进行参数化查询,如 $user = user::find()->where([‘username’ => $usernam…

    2026年8月28日
    100
  • CCleaner怎么设置自动清理_CCleaner自动清理功能的设置方法

    CCleaner通过“监控器”功能可在系统启动时自动提示清理垃圾文件,用户可勾选“系统启动时运行监控器”并开启通知功能,实现开机或活动后提醒清理;若需完全自动化,可结合Windows任务计划程序创建定时任务,使用“/AUTO”命令行参数让CCleaner无人值守自动清理,从而提升系统运行效率。 CC…

    2026年8月28日
    100
  • mac怎么查看wifi密码_mac查看WiFi密码的方法

    可通过系统设置密码应用、钥匙串访问或终端命令找回Mac已保存的Wi-Fi密码:首先在“系统设置-密码”中验证身份后查看;其次用“钥匙串访问”搜索网络名称并显示密码;最后通过终端执行security命令获取。 如果您需要连接另一台设备到已保存的Wi-Fi网络,但忘记了密码,可以通过Mac上的多种方式找…

    2026年8月28日
    000
  • VSCode怎么建立外部样式_VSCode链接外部CSS文件方法教程

    首先创建style.css文件并编写样式,然后在HTML的head中通过link标签引入,最后用Live Server插件实现实时预览;若样式未生效,需检查路径、语法、优先级、缓存及HTML结构,并利用开发者工具调试;大型项目应按模块或页面拆分CSS,结合预处理器、BEM规范和CSS Reset提升…

    2026年8月28日
    000
  • React前端与PHP后端联调:高效定位与解决PHP错误

    本文针对React前端与PHP后端集成时,PHP错误难以追踪的问题,提供了两种高效调试策略。核心在于通过配置PHP服务器端错误日志,将详细错误信息记录到文件,以及利用浏览器开发者工具的网络面板直接检查API的原始响应,从而避免JSON解析错误并快速定位后端问题。 问题剖析:React前端下PHP错误…

    2026年8月28日
    000
  • Yii 框架执行数据库事务时遇到异常怎么处理?

    在 yii 框架中处理数据库事务异常时,应使用 try-catch 块捕获异常并回滚事务。具体方法包括:1) 使用 try-catch 块捕获 exception 和 throwable 异常,并在异常发生时回滚事务;2) 处理事务嵌套,确保只有最外层事务真正提交或回滚;3) 设置事务隔离级别以处理…

    2026年8月28日
    300
  • 使用Flag变量实现Java菜单循环与返回

    本文将介绍如何在Java程序中使用flag变量控制菜单的循环和返回。通过设置和判断flag变量的值,可以实现从子菜单返回主菜单的功能,避免不必要的菜单重复显示,提升用户体验。本文将提供代码示例,详细解释flag变量的工作原理,并给出使用注意事项。 在Java程序中,经常需要构建交互式的菜单界面,让用…

    2026年8月28日
    000
  • Win7蓝屏代码0x00000ed是什么意思?0x00000ed蓝屏代码解决办法

    遇到该问题时,首先可以尝试重启设备,查看是否能恢复正常。若重启后仍然出现蓝屏现象,则建议进入安全模式进行排查。开机时按下F8键,选择“安全模式”启动,随后打开“系统还原”功能,挑选一个较早的时间点执行恢复操作。如以上方法均无效,可考虑使用系统修复工具。插入Win7系统安装盘,在菜单中选择“修复你的计…

    2026年8月28日
    000

发表回复

登录后才能评论
关注微信