1. 项目概述:为什么要在Windows上搭建MinGW开发环境?
如果你是一个在Windows平台上,需要同时与Fortran、C、C++这三种“老牌”但生命力顽强的编程语言打交道的开发者或学习者,那么配置一个统一、轻量且高效的编译环境,几乎是绕不开的第一步。我见过太多新手,在安装Visual Studio这样的大型IDE时被其庞大的体积和复杂的配置劝退,或者在尝试编译一个简单的C程序时,被“gcc不是内部或外部命令”这样的错误提示弄得一头雾水。而MinGW(Minimalist GNU for Windows)的出现,恰恰就是为了解决这个问题。它本质上是一个将经典的GNU编译器集合(GCC)移植到Windows平台上的工具链,让你能在熟悉的Windows命令行或轻量级编辑器(如VSCode)里,享受到与Linux/Unix环境下类似的编译体验。
这个环境的核心价值在于“统一”和“轻量”。你不再需要为Fortran安装一个IFort,为C/C++又安装一个MSVC或Cygwin。一套MinGW,通过不同的组件(gcc, g++, gfortran),就能搞定这三种语言的编译任务。这对于需要处理遗留科学计算代码(通常是Fortran)、进行系统级开发(C语言)或学习现代软件工程(C++)的跨领域开发者来说,效率提升是巨大的。无论是学生完成课程作业,研究员复现算法,还是工程师维护混合语言项目,一个配置妥当的MinGW环境都是得力的起点。接下来,我将带你从零开始,手把手完成这个环境的搭建,并分享一些我多年使用中积累的、能让你少走弯路的实战技巧。
2. 环境准备:MinGW的选型、下载与系统级安装
在Windows上获取GCC编译器,你有几个选择:MSYS2、Cygwin和纯粹的MinGW-w64。对于我们的目标——搭建一个专注于编译Fortran、C、C++程序,且尽可能贴近原生Windows体验的环境——我强烈推荐使用MinGW-w64。MSYS2虽然功能更强大(提供了类似Linux的包管理器),但它附带了一整套Unix工具和运行时库,环境相对复杂;Cygwin则通过一个兼容层在Windows上模拟POSIX环境,其编译出的程序依赖Cygwin DLL。而MinGW-w64的目标是生成本地的Windows程序,不依赖额外的运行时层,更为纯粹和轻量。
2.1 获取MinGW-w64安装包
最直接可靠的途径是从其官方项目或可信的镜像站下载。你可以搜索“MinGW-w64”进入其SourceForge页面。在文件列表中,你会看到很多以版本号和目标架构命名的压缩包。对于大多数现代Windows电脑(64位系统),我建议选择:
- 架构:
x86_64(64位) 或i686(32位)。优先选x86_64以利用现代CPU的全部性能。 - 线程模型:
posix或win32。如果你后续有可能进行多线程编程,并且希望使用C++11标准的<thread>库,那么必须选择posix线程模型。win32模型使用Windows原生线程API,但对C++11标准线程库支持不完整。因此,通常选择posix。 - 异常处理机制:
seh(64位) 或sjlj(32/64位)。对于64位的x86_64架构,seh(结构化异常处理)性能更好,是首选。
一个典型的文件名可能像这样:mingw-w64-x86_64-8.1.0-release-posix-seh-rt_v6-rev0.7z。这表示这是一个64位、使用posix线程和seh异常处理的MinGW-w64版本。
注意:尽量避免从一些个人网站或来路不明的渠道下载所谓的“MinGW安装程序”,它们可能包含过时的编译器、残缺的工具链,甚至恶意软件。直接从SourceForge或MSYS2官方渠道获取是最稳妥的。
2.2 安装与系统路径配置
下载到的通常是一个.7z或.zip压缩包,这代表它是一种“便携式”安装。我们不需要运行复杂的安装向导,只需解压到一个合适的目录即可。
选择安装目录:我强烈建议选择一个没有中文和空格的路径。例如
D:\DevTools\mingw64或C:\mingw64。将压缩包内的所有文件解压到这个目录。解压后,你应该能看到bin、include、lib等子目录。其中bin目录包含了我们最重要的可执行文件,如gcc.exe、g++.exe、gfortran.exe。配置系统环境变量PATH:这是最关键的一步,目的是让Windows在任何命令行窗口都能识别到我们的编译命令。
- 在Windows搜索框输入“环境变量”,选择“编辑系统环境变量”。
- 点击“环境变量”按钮。
- 在“系统变量”区域,找到并选中名为
Path的变量,点击“编辑”。 - 点击“新建”,然后将你的MinGW
bin目录的完整路径(例如D:\DevTools\mingw64\bin)添加进去。 - 重要顺序:确保这个新条目位于列表靠前的位置。因为如果系统里还存在其他版本的gcc(比如某些软件自带的),路径的顺序决定了优先使用哪一个。
验证安装:打开一个新的命令提示符(CMD)或PowerShell窗口(必须新开窗口,才能使环境变量生效),输入以下命令并回车:
gcc --version g++ --version gfortran --version如果每条命令都成功输出了对应的编译器版本信息(如
gcc (x86_64-posix-seh-rev0, Built by MinGW-W64 project) 8.1.0),那么恭喜你,MinGW-w64的核心工具链已经安装并配置成功。如果提示“不是内部或外部命令”,请返回检查路径是否添加正确,以及是否在新终端中测试。
3. 核心工具链解析:GCC、G++与GFortran
安装完成后,我们拥有了三个核心的编译器驱动命令:gcc、g++和gfortran。理解它们的分工和联系,能让你在调用时更加得心应手。
gcc(GNU C Compiler):顾名思义,它主要用于编译C语言程序。当你调用gcc时,它会默认链接C标准库。如果你用它来编译C++代码(.cpp文件),它可能无法自动链接C++标准库(如libstdc++),导致链接错误。因此,编译C代码用gcc。g++(GNU C++ Compiler):这是用于编译C++程序的驱动程序。它和gcc共享大部分底层组件,但会在编译和链接阶段自动添加C++的标准库和必要的编译标志。编译C++代码,应始终使用g++。gfortran(GNU Fortran Compiler):这是GCC项目中的Fortran语言前端。它负责将Fortran源代码(.f,.for,.f90,.f95等)编译为目标代码。虽然它独立发布,但在MinGW-w64套件中,它与gcc、g++共享相同的链接器和运行时库,确保了混合语言编程的可能性。
它们三者的关系可以这样理解:gcc、g++、gfortran是面向不同语言的“前台接待员”,而真正的编译、汇编、链接等重体力活,是由后台共用的“工人团队”(如cc1、cc1plus、f951等实际编译器,以及as汇编器、ld链接器)来完成。这个共享的后台是GCC工具链统一性的基石。
实操心得:在命令行中,你可以通过
-v(verbose) 参数来窥探这个后台过程。例如,输入gcc -v test.c,你会看到编译器调用的详细步骤,包括预处理器、编译器本体、汇编器、链接器的具体路径和参数。这在排查复杂编译问题时非常有用。
4. 从零开始:第一个程序的编译与运行
环境配好了,我们来点实际的。让我们用三种语言各写一个经典的“Hello, World!”程序,并完成编译运行。
4.1 C语言示例
编写源代码:用任何文本编辑器(记事本、Notepad++、VSCode等)创建一个新文件,命名为
hello.c,内容如下:#include <stdio.h> int main() { printf("Hello, World from C!\n"); return 0; }编译:打开命令提示符,导航到
hello.c所在的目录。执行:gcc hello.c -o hello_c.exegcc: 调用C编译器。hello.c: 源文件。-o hello_c.exe:-o参数指定生成的可执行文件名。在Windows上,通常加.exe后缀。
运行:在命令行中输入
hello_c或.\hello_c.exe,你将看到输出结果。
4.2 C++语言示例
编写源代码:创建文件
hello.cpp,内容如下:#include <iostream> int main() { std::cout << "Hello, World from C++!" << std::endl; return 0; }编译:记住,这里必须使用
g++。g++ hello.cpp -o hello_cpp.exe运行:执行
hello_cpp.exe。
4.3 Fortran语言示例
Fortran有多个标准(Fixed格式的FORTRAN 77,自由格式的Fortran 90/95等)。我们以现代的自由格式为例。
编写源代码:创建文件
hello.f90,内容如下:program hello implicit none print *, "Hello, World from Fortran!" end program hello编译:使用
gfortran。gfortran hello.f90 -o hello_fortran.exe运行:执行
hello_fortran.exe。
注意事项:你可能已经注意到,编译Fortran时没有像C/C++那样需要显式指定链接数学库(
-lm)。这是因为gfortran的运行时库已经包含了必要的数学支持。这是不同语言编译器驱动的一个细微差别。
5. 进阶配置:与现代化编辑器VSCode集成
虽然命令行已经足够强大,但配合一个现代化的编辑器如VSCode,可以极大提升开发效率,实现代码高亮、智能提示、一键编译调试等功能。
5.1 安装必要扩展
在VSCode中,你需要安装以下扩展:
- C/C++:由Microsoft发布,提供C/C++的IntelliSense、调试、浏览等功能。
- Fortran:提供Fortran语言支持,推荐“Modern Fortran”或“Fortran Language Support”扩展。
- (可选)Code Runner:一个可以快速运行多种语言代码片段的便捷工具。
5.2 配置编译器路径与构建任务
VSCode的核心配置在于告诉它我们的编译器在哪里,以及如何构建项目。
配置C/C++扩展:按下
Ctrl+Shift+P,输入C/C++: Edit Configurations (UI)并回车。这会打开一个图形化设置界面。- 在“编译器路径”一项中,点击浏览,找到你的MinGW
bin目录下的g++.exe(例如D:\DevTools\mingw64\bin\g++.exe)。gcc.exe也会被自动探测到。 - “IntelliSense 模式”选择
windows-gcc-x64。 - 保存后,VSCode会在当前工作区的
.vscode文件夹下生成一个c_cpp_properties.json文件,其中包含了这些设置。
- 在“编译器路径”一项中,点击浏览,找到你的MinGW
创建构建任务(Tasks):对于需要特定编译参数的项目,我们可以定义自定义的构建任务。按下
Ctrl+Shift+P,输入Tasks: Configure Task,然后选择Create tasks.json file from template->Others。这会生成一个基础的tasks.json文件。我们将其修改为类似下面的内容:{ "version": "2.0.0", "tasks": [ { "label": "build C program", "type": "shell", "command": "gcc", "args": [ "${file}", "-o", "${fileDirname}\\${fileBasenameNoExtension}.exe", "-Wall", "-g" ], "group": { "kind": "build", "isDefault": true }, "presentation": { "echo": true, "reveal": "always", "focus": false, "panel": "shared" }, "problemMatcher": ["$gcc"] } ] }label: 任务名称,在命令面板中显示。command: 编译命令,这里是gcc。args: 编译参数。${file}代表当前活动文件,${fileDirname}和${fileBasenameNoExtension}是其所在目录和文件名(不含扩展名)。-Wall开启大部分警告,-g生成调试信息。group: 将此任务设置为默认的构建任务(Ctrl+Shift+B触发)。
你可以复制这个任务,修改
label、command(改为g++或gfortran)和args,来为C++和Fortran创建独立的构建任务。
5.3 配置调试环境
调试是开发中不可或缺的一环。MinGW-w64附带了GDB(GNU Debugger)。
- 确保编译时包含调试信息:在编译命令中加入
-g参数,如上例所示。 - 配置VSCode调试:点击VSCode左侧活动栏的“运行和调试”图标,然后点击“创建一个 launch.json 文件”,选择
C++ (GDB/LLDB)。这会生成一个launch.json配置文件。关键配置项如下:
配置好后,在代码中设置断点,然后按{ "version": "0.2.0", "configurations": [ { "name": "(gdb) Launch", "type": "cppdbg", "request": "launch", "program": "${fileDirname}\\${fileBasenameNoExtension}.exe", "args": [], "stopAtEntry": false, "cwd": "${fileDirname}", "environment": [], "externalConsole": true, // 建议设为true,避免VSCode内置终端对某些输入处理异常 "MIMode": "gdb", "miDebuggerPath": "D:\\DevTools\\mingw64\\bin\\gdb.exe", // 指向你的gdb.exe路径 "setupCommands": [ { "description": "Enable pretty-printing for gdb", "text": "-enable-pretty-printing", "ignoreFailures": true } ], "preLaunchTask": "build C program" // 与tasks.json中的任务label对应,调试前自动编译 } ] }F5即可启动调试。externalConsole设为true会弹出独立的命令行窗口运行你的程序,这对于需要交互输入的程序尤其重要。
6. 混合语言编程实战:C与Fortran的相互调用
科学计算领域经常需要将高性能的Fortran数值计算库与灵活的C/C++主程序结合。MinGW环境完美支持这种混合编程。关键在于理解不同语言间的函数命名修饰(name mangling)和调用约定(calling convention)。
6.1 从C调用Fortran子程序
Fortran编译器默认会对函数名进行修饰(例如,全部转为小写,并在末尾加下划线)。为了在C中正确调用,我们需要使用Fortran的BIND(C)属性来使用C的调用约定。
Fortran端 (fortran_mod.f90):
module fortran_math use, intrinsic :: iso_c_binding, only: c_double, c_int implicit none contains ! 声明一个使用C约定、可从C调用的函数 real(c_double) function add_numbers(a, b) bind(c, name="add_numbers") real(c_double), value :: a, b add_numbers = a + b end function add_numbers ! 子例程,修改传入的数组 subroutine scale_array(arr, len, factor) bind(c, name="scale_array") use iso_c_binding, only: c_double, c_int integer(c_int), value :: len real(c_double) :: arr(len) real(c_double), value :: factor integer :: i do i = 1, len arr(i) = arr(i) * factor end do end subroutine scale_array end module fortran_mathC端 (main.c):
#include <stdio.h> // 声明从Fortran导入的函数,使用 extern "C" 防止C++名称修饰(如果是C++文件) #ifdef __cplusplus extern "C" { #endif double add_numbers(double a, double b); void scale_array(double arr[], int len, double factor); #ifdef __cplusplus } #endif int main() { double result = add_numbers(3.14, 2.86); printf("3.14 + 2.86 = %f\n", result); double vec[5] = {1.0, 2.0, 3.0, 4.0, 5.0}; scale_array(vec, 5, 2.0); printf("Scaled array: "); for (int i = 0; i < 5; ++i) { printf("%f ", vec[i]); } printf("\n"); return 0; }编译与链接: 这是最关键的一步,需要将两种语言编译的目标文件链接在一起。
# 1. 分别编译,生成目标文件(.o) gfortran -c fortran_mod.f90 -o fortran_mod.o gcc -c main.c -o main.o # 2. 链接所有目标文件,生成最终可执行程序 # gcc 作为链接器,需要显式链接 gfortran 的运行时库 gcc main.o fortran_mod.o -o mixed_app.exe -lgfortran -lquadmath-c: 只编译不链接,生成.o目标文件。-lgfortran: 链接GNU Fortran运行时库。-lquadmath: Fortran运行时库可能依赖的高精度数学库。
6.2 从Fortran调用C函数
反过来,在Fortran中调用C函数更直接一些,因为我们可以控制C函数使用标准的C调用约定。
C端 (clib.c):
#include <stdio.h> // 一个简单的C函数 void print_message_from_c(const char* msg) { printf("[C] Received: %s\n", msg); } // 返回整数的函数 int multiply_in_c(int x, int y) { return x * y; }Fortran端 (main_fortran.f90):
program call_c use, intrinsic :: iso_c_binding implicit none ! 声明C函数的接口,bind(c)是关键 interface subroutine print_message_from_c(msg) bind(c) use iso_c_binding character(kind=c_char) :: msg(*) end subroutine function multiply_in_c(x, y) bind(c) result(res) use iso_c_binding integer(c_int), value :: x, y integer(c_int) :: res end function end interface character(len=30, kind=c_char) :: message integer(c_int) :: a, b, result message = "Hello from Fortran!" // c_char string a = 6 b = 7 call print_message_from_c(trim(message)//c_null_char) ! Fortran字符串需以c_null_char结尾 result = multiply_in_c(a, b) print *, "Fortran got result from C:", a, "*", b, "=", result end program call_c编译与链接:
gcc -c clib.c -o clib.o gfortran -c main_fortran.f90 -o main_fortran.o gfortran main_fortran.o clib.o -o fortran_calls_c.exe这次我们用gfortran作为最终的链接器,它会自动处理Fortran运行时库的链接。
实操心得:数组索引的陷阱。Fortran默认数组索引从1开始,而C从0开始。在相互传递数组指针时,必须非常小心索引的对应关系。一种常见的做法是,在Fortran端始终使用
(1:n)的语法来定义和访问数组,并在C端接收时,将指针视为指向arr[0]到arr[n-1]。清晰的文档和注释在此处至关重要。
7. 性能优化与常用编译选项详解
GCC系列编译器提供了丰富的编译选项,用于控制优化级别、生成调试信息、发出警告等。合理使用这些选项,可以在开发效率和最终程序性能之间取得平衡。
7.1 优化级别选项
-O0(默认):不进行任何优化。编译速度最快,生成的代码最易于调试。适用于开发调试阶段。-O1或-O:进行基本的优化,如删除未使用的代码、简化表达式等。在不太增加编译时间的情况下提供一些性能提升。-O2:进行更多的优化,包括处理器指令调度、循环优化等。这是发布版本最常用的选项,在绝大多数情况下能提供显著的性能提升,且不会过度增加代码体积。-O3:进行更激进的优化,包括自动向量化(如果目标CPU支持)、函数内联等。可能会显著增加编译时间和代码体积,有时甚至可能因为过于激进的优化而导致程序行为异常(尽管符合标准)。建议在关键循环经过充分测试后使用。-Os:优化代码大小。在-O2的基础上,禁用那些通常会增大代码体积的优化选项。适用于嵌入式或对程序体积敏感的场景。-Ofast:在-O3的基础上,允许进行一些不符合严格语言标准的优化(例如,忽略浮点数的舍入误差),以追求极致的速度。科学计算程序需谨慎使用,可能导致数值结果不可靠。
7.2 调试与诊断选项
-g:在可执行文件中加入调试信息(符号表、行号等),这是使用GDB进行源代码级调试的前提。通常与-O0配合用于开发。-Wall:开启“所有”常用警告。这其实并不是真的所有警告,但涵盖了绝大多数常见的可疑代码构造,如未使用的变量、隐式函数声明等。强烈建议始终开启。-Wextra:启用-Wall之外的一些额外警告。-Werror:将所有警告视为错误。在严格的开发流程或构建服务器上使用,确保代码零警告。-pedantic:要求严格遵循ISO C/C++标准。对于需要高度可移植性的代码很有用。
7.3 架构相关优化
-march=native:让编译器为当前正在编译的机器CPU生成最优化的代码(利用其所有指令集扩展,如SSE, AVX等)。这能带来最佳性能,但编译出的二进制文件可能无法在不支持这些指令的老CPU上运行。-mtune=native:优化代码的调度策略以适应本地CPU,但不使用非通用的指令集。生成的代码兼容性更好。
一个典型的发布版本编译命令:
gcc -O2 -march=native -Wall -o myapp.exe myapp.c一个典型的调试版本编译命令:
gcc -O0 -g -Wall -Wextra -o myapp_debug.exe myapp.c8. 常见问题与故障排除实录
即使按照步骤操作,你也可能会遇到一些问题。这里记录了一些我亲身踩过的坑和解决方案。
8.1 “gcc不是内部或外部命令”
- 问题:在CMD中输入
gcc --version提示此错误。 - 排查:
- 检查环境变量:在CMD中输入
echo %PATH%,查看输出的路径列表中是否包含你的MinGWbin目录。如果没有,说明环境变量未生效或设置错误。 - 检查路径正确性:确认你添加到PATH的路径确实指向了包含
gcc.exe的bin文件夹,且路径中没有拼写错误。 - 重启终端:设置环境变量后,必须关闭所有已打开的CMD或PowerShell窗口,重新打开一个新的。
- 用户变量 vs 系统变量:如果你修改的是“用户变量”下的PATH,那么只有当前登录的用户生效。如果修改的是“系统变量”,则对所有用户生效。确保你修改的是正确的。
- 检查环境变量:在CMD中输入
8.2 编译时提示“找不到头文件stdio.h”或“找不到-lxxx库”
- 问题:错误信息类似
fatal error: stdio.h: No such file or directory或cannot find -lpthread。 - 排查:
- 检查MinGW安装完整性:确认你的MinGW目录下有
include和lib文件夹,并且其中包含C标准头文件和库文件。 - 检查编译器前缀:有些MinGW发行版(特别是旧版)使用形如
x86_64-w64-mingw32-gcc.exe的命令。你可以尝试在命令行输入x86_64-w64-mingw32-gcc --version看看是否有效。如果有效,说明你需要使用这个带前缀的命令,或者为gcc创建一个符号链接或别名。但我们现在使用的MinGW-w64通常已经配置好了无前缀的命令。 - 指定头文件和库路径:在极少数情况下,可能需要手动指定。使用
-I选项指定头文件搜索路径,-L指定库文件搜索路径。例如:gcc -I"D:\DevTools\mingw64\x86_64-w64-mingw32\include" -L"D:\DevTools\mingw64\x86_64-w64-mingw32\lib" myapp.c -o myapp.exe
- 检查MinGW安装完整性:确认你的MinGW目录下有
8.3 链接Fortran程序时出现“undefined reference to_gfortran_xxx”
- 问题:在用
gcc链接包含Fortran代码的项目时,出现大量以_gfortran_开头的未定义引用错误。 - 原因与解决:这是最经典的混合链接问题。C链接器(
gcc)不知道需要链接Fortran的运行时库。解决方案:在链接命令末尾显式添加-lgfortran和-lquadmath。gcc main.o fortran_mod.o -o app.exe -lgfortran -lquadmath-lgfortran:链接GNU Fortran运行时库。-lquadmath:Fortran运行时库可能依赖的四倍精度数学库。如果仍有未定义引用,可以尝试再加-lm(数学库)。
8.4 VSCode的IntelliSense报错,但编译正常
- 问题:VSCode编辑器里红色波浪线提示找不到头文件或符号,但用命令行编译完全成功。
- 排查:
- 检查c_cpp_properties.json:确保“编译器路径”设置正确指向了你的
g++.exe。 - 检查包含路径:在
c_cpp_properties.json的includePath和browse.path中,确保包含了MinGW的头文件目录,如${workspaceFolder}/**和D:/DevTools/mingw64/include/**(请替换为你的实际路径)。 - 重新扫描:按下
Ctrl+Shift+P,运行C/C++: Rescan Workspace命令。 - 重启VSCode:有时扩展需要重启才能加载新的配置。
- 检查c_cpp_properties.json:确保“编译器路径”设置正确指向了你的
8.5 程序运行时弹出“缺少libgcc_s_seh-1.dll”等错误
- 问题:编译成功的
.exe文件在另一台没有安装MinGW的电脑上运行时,弹出缺失DLL的错误。 - 原因:你的程序动态链接了MinGW的一些运行时库(DLL)。这些DLL需要随程序一起分发。
- 解决:
- 静态链接:在编译时加入
-static选项,让编译器将所有库静态链接到最终的可执行文件中。这样生成的.exe文件会变大,但不再依赖外部的DLL。gcc -static -O2 -o myapp.exe myapp.c - 动态链接并携带DLL:找到缺失的DLL(通常在MinGW的
bin目录下),将它们复制到你的.exe文件所在的目录,一起分发。
- 静态链接:在编译时加入
8.6 清理C盘空间与MinGW安装
这是一个与开发环境管理相关的实用技巧。MinGW本身并不大,但如果你安装在C盘且空间紧张,或者想彻底卸载重装,可以这样做:
- 卸载:由于是绿色解压版,直接删除整个MinGW安装目录即可。
- 清理环境变量:在系统环境变量PATH中,删除指向该MinGW
bin目录的条目。 - 清理临时文件:编译过程中可能会在系统临时目录(如
C:\Users\<你的用户名>\AppData\Local\Temp)产生中间文件。可以定期使用磁盘清理工具或手动删除。 - 重新安装:按照本文步骤,解压到另一个有充足空间的磁盘分区(如D盘),并重新配置环境变量。
配置一个稳定可靠的开发环境,是高效编程的第一步。MinGW-w64以其轻量、纯净和高度兼容GNU工具链的特性,成为了Windows上进行C/C++/Fortran开发的利器。从简单的单文件编译到复杂的混合语言项目,再到与现代化编辑器VSCode的无缝集成,这套工具链展现出了极大的灵活性。我个人的体会是,初期花些时间彻底弄明白环境变量、编译链接的基本原理以及常见错误的排查方法,远比盲目搜索零散的解决方案要有效率得多。当你熟悉了命令行的编译过程后,再去使用任何IDE都会感到游刃有余,因为你知道它们背后在做什么。最后一个小建议:为自己常用的编译命令(如带有一组优化和警告选项的命令)创建一个简单的批处理文件或Shell脚本,可以进一步提升日常的开发效率。