简介:面向64位Windows平台的MinGW-w64 GCC 7.1.0工具链压缩包,主要解决Windows下缺少原生GCC编译环境、跨平台项目构建困难及旧版GCC兼容性验证等问题,适合C/C++开发者、嵌入式与课程实验学习者使用。压缩包约44.58MB,共13449个文件,其中2086个h头文件、1358个a静态库与243个hpp头文件提供完整开发接口,72个exe、48个dll等组成编译工具链,另有924个py、879个pyc、879个pyo及54个pyd等Python相关组件,便于处理依赖脚本与扩展模块;tcl、msg、txt等文件补充配置与说明信息。bin目录为工具链入口,便于在Windows下直接调用编译命令。已有2473人学习下载,可用于搭建Windows编译环境、复现旧项目构建问题、开展教学实验与工具链学习,目录完整,适合按需取用。
1. 一个 2017 年停更的 C++ 项目,构建脚本里把 gcc 7.1.0 固定了下来,我拿新工具链去编,第三个文件就报 auto_ptr 不在 std 里。回头找 mingw 64位 gcc 7.1.0 安装包才发现,这版本早就没有在线安装源了,只剩离线的解压包。
这类事在维护老项目时很常见:静态库是用 GCC 7 编出来的 .a 文件,CMakeLists 里把标准固定在 C++14,构建脚本依赖 mingw32-make 的老行为。装不对可不是“跑不起来”这么轻描淡写:编译到一半报 CreateProcess: No such file or directory,程序拷到别人机器上又缺 libstdc++-6.dll,一个下午就全耗在路径和 dll 上。下面按我实际装机的顺序走,先选包、再决定放在哪个目录、配 PATH 和 make,最后接 CMake、验证 64 位。
2. 先把包装对:mingw-w64 GCC 7.1.0 的四个后缀与目录规划
MinGW 这类环境,翻车点很少在“装没装”,绝大多数在“装错了包”。7.1.0 是 2017 年前后的构建,文件名长得像x86_64-7.1.0-release-posix-seh-rt_v5-rev1,一串后缀里有两个直接决定你能不能链接通过:线程模型和异常模型。这两个选错,症状不是安装失败,而是编译期一切正常、链接期缺几个莫名其妙的符号,等你反应过来已经浪费了半天。装之前花五分钟把下面这张表对一遍,比出了问题再回头换包要省事得多。
2.1 线程模型与异常模型:两个后缀决定能不能链上
文件名里那串字段,拆开看是这样的:
| 字段 | 本例取值 | 可选值 | 对实际使用的影响 |
|---|---|---|---|
| 目标架构 | x86_64 | x86_64 / i686 | 决定能否生成 64 位程序;GCC 7.1.0 不带多库,64 位包编不出 32 位 exe |
| GCC 版本 | 7.1.0 | 固定 | 老项目的 ABI、默认 C++ 标准都跟它绑死 |
| 构建类型 | release | release / debug | 只有 release 适合日常构建,debug 版运行库带额外检查 |
| 线程模型 | posix | posix / win32 | posix 才有完整的 std::thread、std::mutex 实现 |
| 异常模型 | seh | seh / sjlj / dwarf | 64 位优先 seh,性能好;sjlj 兼容但慢;dwarf 只适合 32 位 |
| 运行时版本 | rt_v5 | 固定 | mingw-w64 运行时版本,与 GCC 版本是配套关系 |
| 打包修订 | rev1 | rev0 / rev1 | 修过的问题包,能用 rev1 就别用 rev0 |
线程模型这一栏最需要说清楚。GCC 7 时代,libstdc++ 的线程设施是跟着线程模型走的:win32 模型下std::thread、std::mutex、std::condition_variable这一套根本没有实现,代码里写了#include <thread>能编过,链接的时候就会报undefined reference to std::thread::_M_start_thread。项目里只要有一处用了多线程,就必须拿 posix 那个包。
异常模型相对好判断:目标是 64 位,就直接选 seh,它走的是 Windows 的结构化异常表,异常抛出时没有额外开销;sjlj 是最保守的方案,什么平台都能跑,代价是每个函数入口都插一段 setjmp,性能打折;dwarf 是 32 位时代的产物,64 位下不要碰。我从那以后拿到任何一份 mingw 包,都是先看文件名里有没有posix-seh,确认无误了才解压。
提示:如果项目里既有 32 位又有 64 位的产物,别指望一个包搞定,直接准备两份目录、两套 PATH,靠脚本切换,比反复改环境变量靠谱。
2.2 为什么老版本只能走解压包,而不是在线安装器
MinGW-w64 的在线安装器(installer)本质是个下载器,它去源站拉当前可用的构建,源站上留下的是最新几个版本。7.1.0 这个年份的包,在源站的索引里早就被后面的版本挤掉了,你打开安装器根本选不到。所以坊间流传的 mingw 64位 gcc 7.1.0 安装包,基本都是以压缩包形式存在的绿色版:解压出来就是完整工具链,不写注册表,不装服务,删掉目录就等于卸载。
绿色版有几个很实际的好处。一是多版本共存特别简单,7.1.0 和后来的新版本各占一个目录,谁在前面谁生效,切换只改 PATH 顺序。二是没有卸载残留,CI 机器上用完直接删。三是可复制,同事环境不对,把整个目录打包发过去,路径一致就基本能跑。
代价也得说清楚:没有 uninstaller,删目录前记得先把 PATH 里那条清掉;没有自动更新,安全补丁自己盯着;压缩包如果来自非官方渠道,完整性没人替你保证,解压后必须自己核对目录结构,这一步后面会写。
2.3 存放目录:空格和中文是两个硬伤
工具链的存放目录,我踩过的最亏的一次是装在C:\Program Files\mingw64下面。当时编译单个文件没事,一上 Makefile 就报CreateProcess: No such file or directory,查了两小时才发现是 gcc 调用 cc1.exe 时路径里的空格没被正确转义。后来统一改成这样的结构:
D:\toolchain\mingw64-7.1.0\ ├── bin\ # gcc.exe g++.exe mingw32-make.exe 等 ├── include\ ├── lib\ ├── libexec\gcc\x86_64-w64-mingw32\7.1.0\ # cc1.exe cc1plus.exe 在这里 ├── share\ └── x86_64-w64-mingw32\ # 目标平台的 sysroot:lib、include三条规矩:路径里不要有空格,不要有中文,层级不要超过三四层。前两条是老生常谈但每年都有人踩;第三条跟 Windows 的 260 字符路径上限有关,CMake 生成的中间文件路径本来就长,工具链再埋深一点,很容易触顶报路径过长。
目录名带上版本号,mingw64-7.1.0这种写法比mingw64好,因为半年后你一定还会装第二个版本,到时候两个mingw64目录谁是谁就分不清了。
2.4 解压后先核对这四处,再动环境变量
拿到包之后不要急着配 PATH,先看目录本身对不对。压缩包经常在根上多包一层,解出来是mingw64\mingw64\bin,直接配 PATH 就全错。核对清单:
bin\gcc.exe、bin\g++.exe、bin\mingw32-make.exe三个都在;libexec\gcc\x86_64-w64-mingw32\7.1.0\cc1.exe存在,缺它就会出现前面那个 CreateProcess 报错;x86_64-w64-mingw32\lib下有libstdc++.a、libwinpthread.a之类的静态库;- 目录名里没有空格和中文。
这四项对上,说明包是完整的,可以往下走;对不上,多半是解压工具把长路径截断了,换 7-Zip 重新解一遍,别硬着头皮配。
3. 安装落地:从压缩包到能编出 exe 的完整步骤
这一章是从零到第一个 exe 的全过程,命令都可以直接抄。顺序上有讲究:先解压到最终位置,再在当前会话里临时改 PATH 验证,验证通过了才写进系统环境变量。反过来做的话,一旦路径写错,你还得再去翻系统属性对话框改回来,而且已经打开的终端全都得重开。
3.1 解压落地与目录归位
用 PowerShell 自带的解压,或者 7-Zip 都行。PowerShell 的写法:
# 先建目标父目录,避免 Expand-Archive 因为末级目录不存在而失败 New-Item -ItemType Directory -Force -Path D:\toolchain | Out-Null # 解压到临时目录,方便检查是否多包了一层 Expand-Archive -Path .\x86_64-7.1.0-release-posix-seh-rt_v5-rev1.zip ` -DestinationPath D:\toolchain\_tmp -Force # 看清楚层级:如果 _tmp 下直接是 bin,就把 _tmp 改名;如果是 _tmp\mingw64\bin,就挪里面那层 Get-ChildItem D:\toolchain\_tmp解压后可能出现两种目录结构:一种是_tmp\bin、_tmp\lib直接铺开,另一种是_tmp\mingw64\bin。前一种把_tmp改名为mingw64-7.1.0就完事;后一种要把内层目录整个移出来,否则 PATH 里会多一级mingw64,和后面写的脚本对不上。
# 情况二:内层目录整体上移 Move-Item D:\toolchain\_tmp\mingw64 D:\toolchain\mingw64-7.1.0 Remove-Item D:\toolchain\_tmp -Recurse -Force-Force是覆盖已存在的目标,重装的时候省一步。移动时用Move-Item而不是复制,是因为工具链文件多、复制慢,同一分区内移动只是改索引,几秒钟完事。
3.2 PATH 怎么写:先临时生效,再落到系统变量
第一步只在当前 PowerShell 会话里改,验证没问题再动系统变量:
# 把工具链 bin 目录插到最前面,保证优先命中 $env:Path = "D:\toolchain\mingw64-7.1.0\bin;" + $env:Path # 立刻验证解析到的是哪个 gcc where.exe gcc gcc -dumpmachinewhere.exe gcc会把 PATH 里所有叫 gcc.exe 的路径按顺序列出来,第一行就是实际生效的那个。如果第一行不是你刚加的目录,说明机器上装了别的东西也带了 gcc,比如某些 IDE 自带的工具链、某些脚本语言发行版附带的编译器。这种情况必须把自己的路径放到最前面,或者干脆从别处把那个目录剔掉。
gcc -dumpmachine输出x86_64-w64-mingw32才对。如果输出i686-w64-mingw32,说明你解压的是 32 位包,别往下走了,重新拿包。
临时验证通过后写系统变量。这里有个坑:setx命令对路径长度有限制,PATH 本来就长的时候会被截断,截断之后你原来的环境变量就废了。稳妥的写法是用 .NET 接口直接读写:
# 读机器级 PATH,追加后写回;只在末尾追加,不覆盖已有内容 $old = [Environment]::GetEnvironmentVariable("Path", "Machine") [Environment]::SetEnvironmentVariable("Path", $old + ";D:\toolchain\mingw64-7.1.0\bin", "Machine")写完之后当前终端不会立刻生效,必须新开一个窗口再敲gcc -v。这一步经常被忽略,然后误以为没写进去,反复写好几次,PATH 里堆出一串重复路径。
注意:如果多版本共存,靠调整 PATH 中的先后顺序来切换,不要反复删改,容易把系统 PATH 改坏。更稳的做法是给每个版本写一个
env-7.1.0.ps1,需要时.\env-7.1.0.ps1一下,只影响当前会话。
3.3 把 mingw32-make 变成 make
GCC 7 这套工具链里带的是mingw32-make.exe,没有make.exe。老项目的 Makefile 和构建脚本里写的都是make,直接跑会报命令找不到。最简单的解法是复制一份改名:
cd /d D:\toolchain\mingw64-7.1.0\bin copy mingw32-make.exe make.exe复制而不是改名,是因为有些 CMake 生成的构建规则里会显式调用mingw32-make,两个名字都留着最省心,代价只是多占一份文件空间。
改完之后验证一下:
make -v正常会打印GNU Make 4.x之类的版本信息。如果报make: *** No targets specified and no makefile found,那反而是好消息,说明 make 本身工作正常,只是当前目录没 Makefile。
3.4 编第一个 hello.c,确认生成的是 64 位程序
写个最小的 C 文件验证整条链路:
/* hello.c:只做两件事,打印指针宽度确认位数,打印版本宏确认编译器 */ #include <stdio.h> int main(void) { printf("pointer size = %zu bytes\n", sizeof(void *)); /* 8 表示 64 位 */ printf("ISO C version = %ld\n", __STDC_VERSION__); return 0; }编译并检查产物:
gcc -O2 -Wall hello.c -o hello.exe .\hello.exe objdump -f hello.exe | findstr "file format"sizeof(void *)输出 8 就是 64 位;objdump -f那行的file format应该是pei-x86-64,如果是pei-i386就说明拿错包了。-Wall建议常开,老代码在新编译器上往往会冒出一堆警告,早看到早处理。
想确认编译器内部用的是哪套搜索路径,可以再跑一条:
gcc -print-search-dirs输出的programs:一行里应该能看到D:/toolchain/mingw64-7.1.0/libexec/gcc/x86_64-w64-mingw32/7.1.0/,这就是 cc1.exe 所在的位置。这条命令在排查“编译器找不到自己组件”这类问题时特别好用,比逐个目录翻快得多。
4. 配置接入:让 CMake 和构建脚本都只认这套 7.1.0
装完能用,和装完能被工程接住,是两件事。工程里通常不止你一个人敲命令行,还有 CMake、IDE、CI 脚本,它们各自有自己找编译器的方式。如果不定死,很容易出现“我这边编出来能用,CI 上编出来 ABI 不兼容”的情况——GCC 5 之后 libstdc++ 引入了双 ABI,std::string在两套 ABI 下符号名不一样,混着链接就是一堆undefined reference to std::__cxx11::basic_string。
4.1 用 toolchain 文件把编译器固定在这个版本上
CMake 找编译器,默认是先看环境变量,再看 PATH,然后自己猜。这套逻辑在老工具链上不可靠,因为它可能猜到你系统里另外装的新版。稳妥做法是写一个 toolchain 文件,把路径写死:
# mingw64-7.1.0.cmake set(CMAKE_SYSTEM_NAME Windows) set(CMAKE_SYSTEM_PROCESSOR x86_64) # 用正斜杠,CMake 在 Windows 上对反斜杠的处理容易出岔子 set(CMAKE_C_COMPILER "D:/toolchain/mingw64-7.1.0/bin/gcc.exe") set(CMAKE_CXX_COMPILER "D:/toolchain/mingw64-7.1.0/bin/g++.exe") set(CMAKE_MAKE_PROGRAM "D:/toolchain/mingw64-7.1.0/bin/mingw32-make.exe") # 让 find_package / find_library 只在工具链的 sysroot 里找头文件和库 set(CMAKE_FIND_ROOT_PATH "D:/toolchain/mingw64-7.1.0/x86_64-w64-mingw32") set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) # 可执行程序还是从本机找,比如 git、python set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) # 库只在 sysroot 里找,避免链到系统里的别的版本 set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)三个FIND_ROOT_PATH_MODE是这套配置的核心。PROGRAM设成NEVER,是因为构建过程需要调用本机的工具(脚本解释器、代码生成器),如果也去 sysroot 里找就全找不到了;LIBRARY和INCLUDE设成ONLY,是为了防止 CMake 顺手把你系统里另一套 MinGW 的头文件拉进来,那种混链最难查。
用法:
cmake -S . -B build -G "MinGW Makefiles" ` -DCMAKE_TOOLCHAIN_FILE=D:/toolchain/mingw64-7.1.0.cmake ` -DCMAKE_BUILD_TYPE=Release cmake --build build -j 8-G "MinGW Makefiles"这个 generator 必须和工具链匹配。如果选成Visual Studio或者Ninja,CMake 会去走另一套编译器探测逻辑,toolchain 文件里设的 gcc 就被绕过了。-j 8按核数给,老机器给 4 就行,给太多内存吃紧反而更慢。
注意:换了 toolchain 文件之后,必须把
build目录删掉重来。CMake 会把第一次探测到的编译器路径缓存进CMakeCache.txt,改文件不删缓存是没用的,这个坑几乎每个人都踩过一次。
4.2 静态链接三个运行时库:参数怎么加、什么时候别加
用 mingw 编出来的 exe,默认动态链接libgcc_s_seh-1.dll、libstdc++-6.dll、libwinpthread-1.dll这三个。在自己机器上跑没问题,拷到没装过 MinGW 的机器上立刻报缺 dll。生产构建一般都要静态链进去:
g++ main.cpp util.cpp -o app.exe -std=c++1z -O2 ` -static-libgcc -static-libstdc++ ` -Wl,-Bstatic,--whole-archive -lwinpthread -Wl,--no-whole-archive ` -Wl,--gc-sections -s逐个说:-static-libgcc和-static-libstdc++是 gcc 自己的开关,把这两个运行时静态链进去,对应的 dll 依赖就没了。-lwinpthread没有官方开关,得用链接器参数手工包一层:-Bstatic之后进入静态模式,--whole-archive强制把整个静态库拉进来(否则 posix 线程那部分符号会因为没被直接引用而被丢掉,运行时照样缺 dll),--no-whole-archive退出这个模式,避免后续库也被整包拉进来。--gc-sections删掉没用到的段,-s去掉符号表,两个一起用能把体积压下来一截。
什么情况别全静态:如果你在写插件或者要跟别的模块共享运行时,全静态会导致多份运行时状态,堆上分配的对象跨模块释放就出问题。这种场景保留动态链接,把三个 dll 复制到 exe 同目录更安全。
4.3 标准与编码:-std=c++1z 和 -fexec-charset 的实际取舍
GCC 7.1.0 的默认 C++ 标准是gnu++14,不是 17。工程里要用 C++17 的特性,得显式加参数:
g++ main.cpp -std=c++1z -O2 -o app.exe注意这里写的是c++1z而不是c++17。GCC 7 对 C++17 是部分支持,当时的正式名字还是c++1z,c++17作为别名在部分构建里能识别、部分不能,写c++1z最保险。真正要用到完整 C++17 的工程,7.1.0 这个版本本来就不够,那是另一个话题了。
编码是另一处高频翻车。源文件一般存成 UTF-8,而 Windows 控制台默认是 GBK 代码页,printf出来的中文全是乱码。两个解法,选一个:
# 解法一:让编译器把执行字符集转成 GBK,产物直接适配中文控制台 gcc main.c -finput-charset=UTF-8 -fexec-charset=GBK -o app.exe # 解法二:不改产物,跑之前把控制台切成 UTF-8 # chcp 65001第一种适合要发给别人用的工具,双击就能正常显示;第二种适合自己调试,产物保持 UTF-8 干净。两种别混着用,否则会出现“我这儿好好的,别人那儿是乱码”的经典问题。-finput-charset是告诉编译器源文件按什么编码读,-fexec-charset是告诉它生成的字符串常量按什么编码写,两个参数各管一头。
5. 避坑与排查:五条我真实踩过的记录
下面这五条,每一条都是我或者同事在装这套 7.1.0 的时候真实遇到的,按“现象 → 原因 → 解决”记,遇到了直接对号入座,能省不少时间。
5.1 报 CreateProcess: No such file or directory
现象:gcc hello.c -o hello.exe直接失败,错误信息是gcc: error: CreateProcess: No such file or directory,但gcc -v又能正常打印版本。
原因:gcc 驱动本身没问题,是它去调 cc1.exe 的时候没找到。九成是安装路径里带了空格或中文,C:\Program Files这种最典型;剩下一成是 PATH 里混进了别的工具链,gcc.exe 和 cc1.exe 来自两个不同的目录。
解决:先where.exe gcc看命中的是哪个,再把工具链挪到D:\toolchain\mingw64-7.1.0这种纯英文无空格路径下,新开终端重试。如果路径没问题还是报,用gcc -print-search-dirs看programs:里的路径对不对得上实际目录。
5.2 本机跑得好好的,换个机器就缺 libstdc++-6.dll
现象:exe 在自己电脑上双击正常,发给测试同事,弹窗提示缺少libstdc++-6.dll,点了确定程序直接退出。
原因:默认动态链接 gcc 运行时,你机器上因为装了工具链所以 dll 在 PATH 里,别人机器上没有。
解决:按 4.2 的参数静态链接。如果因为共享运行时的原因不能静态链,就把bin下的libgcc_s_seh-1.dll、libstdc++-6.dll、libwinpthread-1.dll三个一起拷到 exe 同目录,别只拷报错提示的那一个——通常拷完一个会接着报下一个。
5.3 std::thread 编过但链接失败
现象:代码里用了std::thread,编译阶段没报错,链接时报undefined reference to 'std::thread::_M_start_thread(...)'。
原因:拿的是 win32 线程模型的包。GCC 7 在 win32 模型下 libstdc++ 没有实现线程设施,头文件存在所以能编过,实现不存在所以链不上。
解决:换成posix线程模型的包,gcc -v的输出里能看到Thread model: posix这一行,对上了才算换对。这个错误没法靠加-lwinpthread绕过,因为符号本身就不存在。
5.4 跟新版本工具链混用,报 __cxx11 相关未定义符号
现象:链接第三方静态库时报undefined reference to std::__cxx11::basic_string<...>::~basic_string(),一堆符号看着都对,就是链不上。
原因:GCC 5 之后 libstdc++ 引入双 ABI,std::string有_GLIBCXX_USE_CXX11_ABI=1和=0两套符号。第三方.a是某套 ABI 编的,你这边用的是另一套,或者干脆是另一个大版本的 GCC,符号对不上。
解决:先确认第三方库是用哪个版本、哪套 ABI 编出来的,然后自己这边保持一致。7.1.0 默认走新 ABI;如果库是老 ABI 编的,编译时加-D_GLIBCXX_USE_CXX11_ABI=0。最忌讳的是把两套 ABI 的产物链进同一个可执行文件,那种崩溃是偶发的、堆栈还指不到点子上。
5.5 改完系统 PATH,新终端里还是不生效
现象:用setx追加了路径,关掉终端重开,gcc -v还是找不到命令。
原因:两种可能。一是setx把过长的 PATH 截断了,后面那段全丢了,你加的恰好落在被截掉的部分;二是重开的终端是从旧的父进程继承的环境,比如某些编辑器内嵌的终端不会重新读系统变量。
解决:用[Environment]::GetEnvironmentVariable("Path","Machine")读出来看看长度和你加的那段在不在。不在的话用[Environment]::SetEnvironmentVariable重写一遍,别再用setx。编辑器内嵌终端的问题,从开始菜单重新开一个独立窗口验证。
6. 装完怎么验证:一套五分钟能跑完的回归检查
装完不验证,等于没装。我给这套 7.1.0 写了个check.bat,每次换机器、换目录、升完别的软件之后都跑一遍,五分钟内能把所有关键点扫出来。放在工具链同级目录,双击就行:
@echo off setlocal set TC=D:\toolchain\mingw64-7.1.0\bin set PATH=%TC%;%PATH% echo [1] gcc 解析位置 where gcc echo [2] 目标三元组(应为 x86_64-w64-mingw32) gcc -dumpmachine echo [3] 版本与线程模型(应含 7.1.0 与 Thread model: posix) gcc -v 2>&1 | findstr /C:"gcc version" /C:"Thread model" /C:"Target" echo [4] 编译器内部组件路径 gcc -print-search-dirs | findstr /C:"programs" echo [5] make 是否可用 make -v 2>&1 | findstr /C:"GNU Make" echo [6] 编译并检查产物架构 gcc -O2 -Wall "%~dp0hello.c" -o "%~dp0_hello.exe" || goto :fail objdump -f "%~dp0_hello.exe" | findstr /C:"file format" del /q "%~dp0_hello.exe" echo CHECK PASS exit /b 0 :fail echo CHECK FAIL exit /b 1这套检查里,第 2、3、6 项是三根支柱。-dumpmachine确认目标架构;gcc -v里的Thread model: posix确认拿的不是 win32 包,gcc version 7.1.0确认版本没被别的工具链顶掉;objdump -f的pei-x86-64确认产物真的是 64 位。这三项过了,日常构建基本不会出大问题。
我还会额外加一条针对项目本身的冒烟测试:把工程里最难编的那三个源文件单独拎出来,用最终要用的那套参数编一遍。因为工具链本身没问题、工程编不过的情况太常见了——缺了某个第三方头文件、某个#pragma在新版本里行为变了、某个静态库的 ABI 对不上,这些只有编真实代码才能暴露出来。
提示:把这套检查接进 CI 的第一个 job,比人工跑可靠。工具链的坑大多是环境漂移引起的,早一步发现,比等到发布前夜再查要舒服得多。
最后一条血泪经验:不要相信“上次装好了这次不用验”。我就吃过这个亏,机器上装了某 IDE,它悄悄往 PATH 里塞了自己的工具链,而顺序排在我这前面,结果编译出来的程序在另一台机器上崩了——原因是调到了别的运行时库,用where gcc一查就查出来了。从那以后,我每次换机器、改 PATH、装完任何带编译器的软件,都强制走一遍check.bat,不看输出不往下写代码。希望帮到你。
本文还有配套的精品资源,点击获取