简介:本资源是面向科学计算学习者与VNOI编程竞赛参赛者的Fortran开发环境实战包,聚焦VSCode平台下的Fortran高效编码与调试全流程。压缩包含99个文件,总大小20.6MB,涵盖9个Fortran源码(.for)、9个Visual Studio项目配置文件(.vfproj、.sln)、10个可执行程序(.exe)及配套调试符号(.pdb)、HTML文档与PDF教程(如《ngon_ngu_lap_trinh_fortran_90.pdf》《Input and output.pdf》),完整呈现从环境搭建、语法实践到经典算法实现(FLOYD、QBSEQ、SPSEQ等)的闭环学习路径。已有365人下载学习,资源结构清晰,直接支持VSCode+GFortran快速上手,附带IO操作、格式化输入输出、数组与子程序调用等高频考点示例代码及配套说明,特别适合作为竞赛备赛或科研入门的即用型开发模板。
1. 项目概述:在VSCode中复活一门“古老”的语言
如果你是一位计算物理、流体力学、气象学或者某些特定工程领域的从业者或学生,那么“FORTRAN”这个名字对你来说一定不陌生。这门诞生于1957年的语言,至今仍在科学计算和高性能计算(HPC)领域占据着不可撼动的地位。然而,当新手们兴致勃勃地打开这门语言的教程,准备用现代的开发工具——比如Visual Studio Code(VSCode)——来开启学习或工作时,往往会遇到第一个拦路虎:“为什么我的VSCode对.f90文件毫无反应?代码没有高亮,没有提示,甚至连编译运行都不知道怎么配置?”
这正是“FORTRAN.rar_Fortran_in_vscode for Fortran”这个项目标题背后所指向的核心痛点。它不是一个复杂的软件项目,而是一个针对特定开发环境(VSCode)和特定语言(Fortran)的集成配置指南。它的目标非常明确:帮助用户,尤其是从现代语言(如Python、C++)转向或需要接触Fortran的用户,在当下最流行的代码编辑器VSCode中,搭建一个高效、舒适、功能完整的Fortran开发环境。
你可能会问,都202X年了,为什么还要折腾Fortran?原因很简单:遗产代码和性能。全球有海量的科学计算核心库(如BLAS、LAPACK的参考实现)、气候模型、计算流体动力学(CFD)求解器都是用Fortran写的。直接重写这些经过数十年验证和优化的代码成本极高且风险巨大。因此,学习和配置Fortran开发环境,对于需要深入这些领域的研究人员和工程师来说,是一项必备的生存技能。而VSCode以其轻量、插件化和强大的社区支持,成为了配置这类“非主流”语言环境的绝佳平台。
接下来,我将以一个在Linux/macOS和Windows系统上都实际配置过Fortran环境的过来人身份,为你拆解整个配置过程。我会告诉你每一步背后的原因,分享我踩过的坑,并提供一个即拿即用的配置方案。无论你是要运行一段经典的Fortran 77代码,还是编写现代的Fortran 2008模块,这篇文章都能让你在VSCode里获得不输于现代语言的开发体验。
2. 环境准备:编译器、扩展与基础配置
在VSCode里写任何语言,第一步永远不是找插件,而是确保你的系统里有这门语言的“发动机”——编译器或解释器。对于Fortran来说,这是最容易让人困惑的第一步。
2.1 编译器的选择与安装
Fortran编译器主要有几个选择:GNU的gfortran、Intel的ifort、以及LLVM生态的flang。对于绝大多数用户,尤其是新手和跨平台用户,gfortran是毫无争议的首选。
为什么是gfortran?
- 免费且开源:它是GNU编译器集合(GCC)的一部分,没有任何授权费用。
- 跨平台支持极好:在Linux上通常通过包管理器一键安装;在macOS上可通过Homebrew或MacPorts安装;在Windows上也有成熟的发行版(如MinGW-w64或MSYS2)。
- 标准支持全面:对Fortran 95/2003/2008乃至部分2018标准都有良好的支持,足以应对绝大多数科研和工程代码。
- 生态成熟:是与
gcc、g++同一套工具链,调试器(GDB)兼容性好,便于后续调试。
各平台安装命令速查:
- Ubuntu/Debian:
sudo apt-get install gfortran - Fedora/RHEL/CentOS:
sudo dnf install gcc-gfortran(或yum install gcc-gfortran) - macOS (使用Homebrew):
brew install gcc(安装的是包含gfortran的完整GCC套件。注意:安装后命令可能是gfortran-13这样的版本号形式,需要创建软链接或使用别名)。 - Windows:
- 推荐使用MSYS2。安装MSYS2后,在MSYS2终端中运行:
pacman -S mingw-w64-ucrt-x86_64-gcc-fortran(对于64位系统)。安装后,gfortran的可执行文件路径通常在MSYS安装目录\ucrt64\bin\下。 - 或者使用MinGW-w64的独立发行版,直接下载包含gfortran的安装包。
- 推荐使用MSYS2。安装MSYS2后,在MSYS2终端中运行:
注意:Windows下安装后,务必将编译器的
bin目录(例如C:\msys64\ucrt64\bin)添加到系统的PATH环境变量中。这是后续VSCode和终端能够找到gfortran命令的关键。
安装完成后,打开系统终端(Windows用CMD或PowerShell),输入gfortran --version。如果能看到版本信息,恭喜你,最基础也是最关键的一步已经完成了。
2.2 VSCode核心扩展安装
VSCode的强大在于扩展市场。对于Fortran开发,我们主要需要两类扩展:语言支持和构建/调试支持。
Modern Fortran (
krvajalm.linter-gfortran):这是必装的核心扩展。它提供了:- 语法高亮:让你的代码五彩斑斓,结构清晰。
- 代码片段:输入
prog、func、sub等关键字可以快速生成程序、函数、子例程的模板。 - 基础符号跳转:在同一个文件内跳转到模块、函数定义。
- 集成
gfortran错误提示:在问题面板和代码行内直接显示编译错误,这是提升效率的神器。
Fortran IntelliSense (
hansec.fortran-ls):这是强烈推荐的扩展,用于提升代码编辑体验。它基于Language Server Protocol (LSP),提供:- 自动补全:输入模块名、变量名时的智能提示。
- 函数签名帮助:调用函数时显示参数列表。
- 悬停信息:鼠标悬停在变量或函数上时显示其定义信息。
- 更好的跨文件符号解析:对于多文件项目,它能更好地理解模块间的依赖关系。
实操心得:
Modern Fortran扩展的开发者将其linter功能与gfortran深度集成,这意味着它显示的警告和错误几乎与你在终端编译时看到的一模一样,非常可靠。而Fortran IntelliSense扩展有时在大型或非标准项目上可能解析会卡顿,如果遇到性能问题,可以暂时禁用它,仅用Modern Fortran也完全能工作。
- Code Runner (
formulahendry.code-runner):这是一个万金油插件,并非Fortran专属,但能极大简化单个文件的编译运行流程。安装后,你可以在代码文件里右键选择“Run Code”,或者使用快捷键Ctrl+Alt+N,它会自动调用预设命令(如gfortran)编译并运行当前文件。
安装完这些扩展后,VSCode的侧边栏活动栏应该会出现Fortran相关的图标,你的.f90,.f95,.f03,.f等文件也应该有了颜色。
2.3 工作区与基础设置
建议为你每个Fortran项目创建一个独立的文件夹,并用VSCode打开这个文件夹(“文件”->“打开文件夹”)。这样所有的配置都可以保存在项目级的.vscode文件夹中,与项目绑定,不会影响其他项目。
接下来,我们进行一些基础设置。按下Ctrl+Shift+P,输入“Preferences: Open Settings (JSON)”,打开用户或工作区设置文件。我更喜欢配置在工作区(.vscode/settings.json),因为更具可移植性。
{ // 指定 Fortran 文件的默认格式化工具,Modern Fortran 扩展内置了基础格式化 "[fortran]": { "editor.defaultFormatter": "krvajalm.linter-gfortran", "editor.formatOnSave": true // 保存时自动格式化,按需开启 }, // 配置 Code Runner 针对 Fortran 文件的命令 "code-runner.executorMap": { "fortran": "cd $dir && gfortran -ffree-form -std=f2008 -Wall -Wextra -fimplicit-none \"$fileName\" -o \"$fileNameWithoutExt\" && $dir\"$fileNameWithoutExt\"", }, // 让 Code Runner 在终端运行,以便与程序交互(如输入数据) "code-runner.runInTerminal": true, // 可选:保存时自动运行构建任务(如果你配置了 tasks.json) // "editor.codeActionsOnSave": { // "source.fixAll": true // } }设置解读:
"[fortran]":针对所有Fortran文件类型应用规则。editor.formatOnSave是个好习惯,但如果你在编辑遗留的固定格式代码(.f),可能需要关闭,因为自动格式化可能会破坏其严格的列格式。code-runner.executorMap:这是给Code Runner插件用的。它定义了一个“魔法命令”:cd $dir:先切换到文件所在目录。gfortran ...:编译命令。-ffree-form表示自由格式(现代Fortran);-std=f2008指定语言标准;-Wall -Wextra开启大部分警告;-fimplicit-none强制要求所有变量必须显式声明,这是一个极其重要的好习惯,能避免很多隐蔽的错误。-o ...:指定输出可执行文件名。&& ...:如果编译成功,则运行生成的可执行文件。
runInTerminal:设置为true后,程序会在VSCode内置终端运行,你可以进行输入操作。如果设为false,程序输出会显示在“输出”面板,但无法交互。
至此,一个最基础的、能写能跑单文件的Fortran环境就配好了。你可以创建一个hello.f90文件,写下经典的print *, "Hello, Fortran in VSCode!",然后用Code Runner运行试试看。
3. 进阶配置:多文件项目、调试与构建系统
实际项目几乎不可能只有一个文件。模块(Module)、主程序、外部子程序通常分散在多个文件中。此外,调试复杂程序也是必不可少的。这就需要更强大的配置。
3.1 管理多文件项目与模块依赖
Fortran使用MODULE来封装数据、接口和过程。一个模块通常在一个独立的.f90文件中定义,然后被其他文件USE。编译器需要知道所有文件的编译顺序。
最简单直接的方法:手动编译链假设你有以下文件:
constants_mod.f90(定义一些常量)math_utils_mod.f90(定义数学工具,USE constants_mod)main.f90(主程序,USE math_utils_mod)
在终端中,你需要按依赖顺序编译:
gfortran -c constants_mod.f90 # 生成 constants_mod.o gfortran -c math_utils_mod.f90 # 生成 math_utils_mod.o gfortran main.f90 constants_mod.o math_utils_mod.o -o my_program # 链接在VSCode中,我们可以用Tasks来自动化这个过程。
3.2 配置构建任务 (tasks.json)
在项目根目录下创建.vscode文件夹,并在其中创建tasks.json文件。这个文件定义了各种自动化任务。
{ "version": "2.0.0", "tasks": [ { "label": "Build Fortran Project", "type": "shell", "command": "gfortran", "args": [ "-ffree-form", "-std=f2008", "-Wall", "-Wextra", "-fimplicit-none", "-g", // 添加调试信息 "-J${workspaceFolder}/mod", // 指定模块文件(.mod)输出目录 "-I${workspaceFolder}/include", // 指定头文件(如果有)搜索路径 "${workspaceFolder}/src/constants_mod.f90", "${workspaceFolder}/src/math_utils_mod.f90", "${workspaceFolder}/src/main.f90", "-o", "${workspaceFolder}/bin/${workspaceFolderBasename}.exe" ], "group": { "kind": "build", "isDefault": true }, "problemMatcher": ["$gcc"] // 使用GCC问题匹配器,让错误出现在问题面板 }, { "label": "Clean Build", "type": "shell", "command": "rm", // Linux/macOS // Windows 下可改为 "command": "cmd", "args": ["/C", "del /Q ..."] "args": [ "-rf", "${workspaceFolder}/bin/*", "${workspaceFolder}/mod/*", "${workspaceFolder}/*.o", "${workspaceFolder}/*.mod" ], "group": "build" } ] }配置详解:
label:任务名称,会在命令面板中显示。type:shell表示在shell中执行。args中的关键参数:-g:生成调试信息,为后续使用调试器做准备。-J./mod:非常重要!它告诉gfortran将编译生成的模块文件(.mod)输出到./mod目录。这能保持源码目录的整洁,并避免模块文件散落各处导致的混乱。-I./include:如果你的项目有.h或.inc等包含文件,可以放在include目录,并通过此参数指定搜索路径。
group:"isDefault": true使得这个任务成为默认构建任务。你可以按Ctrl+Shift+B直接运行它。problemMatcher: ["$gcc"]:这个设置是精髓。它让VSCode能够解析gfortran输出的错误信息,并高亮显示在问题面板和对应的代码行上,实现“点击错误跳转到代码”。
配置好后,按Ctrl+Shift+B,VSCode就会执行编译,并在终端输出结果。如果编译出错,问题面板会列出所有错误和警告。
3.3 配置调试环境 (launch.json)
调试是开发的核心环节。VSCode通过launch.json文件配置调试器。对于Fortran,我们使用GDB(GNU Debugger)。
首先,确保你的编译命令中包含了-g参数(如上一步tasks.json所示)。然后在.vscode文件夹下创建launch.json:
{ "version": "0.2.0", "configurations": [ { "name": "(gdb) Launch Fortran Program", "type": "cppdbg", // 注意:这里用的是cppdbg,因为GDB也支持Fortran "request": "launch", "program": "${workspaceFolder}/bin/${workspaceFolderBasename}.exe", "args": [], // 可以在这里添加命令行参数,如 ["input.txt", "output.txt"] "stopAtEntry": false, "cwd": "${workspaceFolder}", "environment": [], "externalConsole": false, // 使用VSCode内置终端进行I/O "MIMode": "gdb", "miDebuggerPath": "gdb", // 如果gdb不在PATH,需指定完整路径,如“C:\\msys64\\ucrt64\\bin\\gdb.exe” "setupCommands": [ { "description": "Enable pretty-printing for gdb", "text": "-enable-pretty-printing", "ignoreFailures": true } ], "preLaunchTask": "Build Fortran Project" // 调试前自动执行构建任务 } ] }关键点解析:
type: "cppdbg":虽然调试的是Fortran,但调试器接口是通用的。VSCode的C/C++扩展提供了这个调试类型,我们需要安装ms-vscode.cpptools扩展来获得支持。是的,为了调试Fortran,你需要安装C/C++扩展。这是目前最稳定的方案。preLaunchTask:这个设置非常方便。它指定在启动调试会话前,自动执行tasks.json中那个label为“Build Fortran Project”的任务。这意味着你修改代码后,直接按F5开始调试,VSCode会自动先编译,再启动调试器。miDebuggerPath:在Windows上,如果你单独安装了MinGW-w64或MSYS2,需要确保这里的路径指向正确的gdb.exe。在Linux/macOS上,通常gdb已在PATH中。
配置完成后,在你的Fortran代码中设置断点(点击行号左侧),然后按F5。程序会在断点处暂停,此时你可以查看左侧的“变量”窗口监视所有变量,使用顶部的调试工具栏(继续、单步跳过、单步进入、单步跳出)控制执行流程,并在“调试控制台”中输入GDB命令。
踩坑实录:调试时最常见的两个问题:1) 变量窗口显示
<optimized out>。这是因为编译器优化(如-O2)会改变变量存储方式。调试时请在编译选项中去掉优化标志(-O0是默认的,或者显式加上-O0)。2) 数组内容显示不全。在“监视”窗口中,你可以输入表达式,如array(1:10)来查看数组片段,或者使用GDB命令print array(1:10)。
4. 高效开发工作流与实用技巧
环境配好了,接下来就是如何用得顺手。分享几个我实践中总结出来的,能极大提升Fortran开发效率的技巧。
4.1 利用片段 (Snippets) 和模板加速编码
Modern Fortran扩展自带了一些基础片段。但你完全可以自定义。打开命令面板(Ctrl+Shift+P),输入“Configure User Snippets”,选择“fortran”。这会打开fortran.json文件。你可以添加自己的片段,例如:
{ "Module Template": { "prefix": "mod", "body": [ "module ${1:module_name}", " implicit none", " private", " public :: ${2:public_subroutine}", "", "contains", "", " subroutine ${2:public_subroutine}()", " implicit none", " $0", " end subroutine ${2:public_subroutine}", "", "end module ${1:module_name}" ], "description": "Create a new Fortran module with public/private sections" } }这样,在.f90文件中输入mod并按Tab键,就会自动生成一个结构良好的模块模板,光标会依次跳转到module_name、public_subroutine等位置等你填写。
4.2 处理遗留代码(固定格式.f文件)
很多老代码是固定格式(Fixed Format):第1-5列是标号区,第6列是续行符,第7-72列是代码区。VSCode和Modern Fortran扩展能很好地支持它,但需要注意:
- 文件扩展名通常为
.f,.for,.f77。 - 在
settings.json中,可以为固定格式文件设置不同的编译选项,避免使用-ffree-form:{ "files.associations": { "*.f": "fortran-fixed-form" // 确保扩展能识别 }, "[fortran-fixed-form]": { "editor.defaultFormatter": "krvajalm.linter-gfortran" } } - 编译时,对于固定格式文件,不要使用
-ffree-form标志。如果代码是Fortran 77风格,可能需要添加-std=legacy来放宽一些现代标准的检查。
4.3 集成外部库(如BLAS, LAPACK, NetCDF)
科学计算离不开外部库。假设你的系统已经通过包管理器安装了libblas和liblapack(在Ubuntu上是libblas-dev和liblapack-dev)。
在tasks.json的构建任务args中,你需要添加链接库的参数:
"args": [ // ... 之前的编译参数 ... "${workspaceFolder}/src/main.f90", "-o", "${workspaceFolder}/bin/my_program", "-llapack", // 链接LAPACK库 "-lblas", // 链接BLAS库 "-L/usr/local/lib", // 如果库不在标准路径,用-L指定库搜索路径 "-I/usr/local/include" // 用-I指定模块文件(.mod)或头文件搜索路径 ]对于更复杂的库如NetCDF(提供了Fortran接口),你需要同时链接NetCDF的C库和Fortran库,通常类似-lnetcdff -lnetcdf,并且确保-I参数指向了安装NetCDF时生成的.mod文件所在目录。
4.4 利用问题面板和终端进行高效排错
- 问题面板是你的朋友:编译后,所有错误和警告都会集中在这里。点击错误信息可以直接跳转到出错行。
Modern Fortran扩展的linter功能甚至能在你输入时就实时检查一些语法错误。 - 善用集成终端:VSCode的终端与编辑器深度集成。你可以方便地在终端里运行编译命令、调试命令(
gdb)、或者运行程序。使用Ctrl+``(反引号键)可以快速开关终端。 - 版本控制集成:VSCode内置了出色的Git支持。对于Fortran项目,虽然代码是文本,但生成的
.mod文件和可执行文件是二进制文件。务必在你的.gitignore文件中添加如下内容:
这样只将源码和必要的配置文件纳入版本控制。# 编译输出 *.o *.mod *.exe *.out bin/ mod/ # 编辑器临时文件 .vscode/ !.vscode/settings.json !.vscode/tasks.json !.vscode/launch.json
5. 常见问题与故障排除实录
即使按照指南一步步来,也难免会遇到问题。这里汇总了我自己和社区里常见的一些“坑”及其解决方案。
5.1 编译与链接问题
问题1:undefined reference togfortran...‘`
- 现象:链接阶段报错,提示找不到
_gfortran开头的符号。 - 原因:这通常是链接器找不到Fortran运行时库。在纯Fortran项目中较少见,但在混合C/C++和Fortran的项目中,或者在某些Linux发行版上,链接顺序不对可能导致此问题。
- 解决:确保链接命令中,Fortran源文件(
.o或.f90)出现在链接器命令中,并且尝试在命令末尾显式添加-lgfortran。在更复杂的情况下,可能需要-lquadmath等库。一个典型的混合编译链接顺序是:g++ main.cpp fortran_obj.o -lgfortran -lstdc++。
问题2:.mod文件找不到
- 现象:编译时报错
Fatal Error: Can‘t open module file ‘xxx.mod’ for reading。 - 原因:模块
USE了另一个模块,但编译器找不到对应的.mod文件。.mod文件是编译模块源文件时生成的。 - 解决:
- 确保依赖模块先被编译。在
tasks.json中,源文件的顺序很重要,被依赖的模块文件要放在前面。 - 使用
-J参数指定.mod输出目录,并使用-I参数指定.mod搜索目录。如前文配置,用-J./mod输出,并在编译依赖该模块的文件时,添加-I./mod。 - 检查模块名和文件名是否匹配。通常约定
module my_module保存在my_module.f90中,生成的模块文件就是my_module.mod。
- 确保依赖模块先被编译。在
问题3:代码有警告但能运行,需要管吗?
- 强烈建议管。Fortran的很多警告预示着潜在的风险,尤其是:
Implicit type:未声明变量类型。务必使用-fimplicit-none编译选项并在每个作用域implicit none,这能消灭90%因拼写错误导致的诡异bug。Unused variable:未使用的变量。检查是代码冗余还是逻辑错误。Character length mismatch:字符串长度不匹配。在赋值或传参时可能导致截断或内存问题。 把这些警告都解决掉,你的代码会健壮很多。
5.2 编辑器与扩展问题
问题4:IntelliSense(自动补全)不工作或很慢
- 原因:
Fortran IntelliSense扩展基于Language Server,对于大型项目或包含许多模块的文件,初始解析可能需要时间,有时会卡住。 - 解决:
- 检查输出面板(
Ctrl+Shift+U)中“Fortran Language Server”是否有错误日志。 - 尝试在设置中限制其扫描范围:在
settings.json中添加"fortran-ls.workspaceSymbols.enabled": false可以禁用耗资源的全局符号扫描。 - 最直接的方法:如果项目太大导致体验不佳,可以暂时禁用此扩展,仅依赖
Modern Fortran的基础补全和片段功能。对于阅读和编辑代码,语法高亮和错误提示才是核心。
- 检查输出面板(
问题5:Code Runner运行后程序一闪而过
- 原因:程序执行完毕,终端自动关闭。
- 解决:在代码末尾添加一个等待输入的语句。对于学习和小测试,一个经典的做法是:
或者,更简单地,在Code Runner的命令末尾加上一个暂停命令(Windows是program hello print *, "Hello, World!" ! 等待用户按回车再结束 print *, "Press ENTER to exit..." read(*,*) end program hellopause,Linux/macOS是read),但修改插件全局命令比较麻烦。使用read(*,*)是跨平台的解决方案。
5.3 调试器相关问题
问题6:调试时变量显示<optimized out>
- 原因:这是最经典的调试问题。编译器为了优化性能,可能会将变量存储在寄存器中、完全消除(如果它认为没用)、或者进行其他变换,导致调试器无法在内存中找到它。
- 解决:调试时务必使用
-O0(零优化)标志进行编译。在你的tasks.json构建任务的args中,确保没有-O1,-O2,-O3或-Ofast等优化标志。-g本身不禁止优化,所以需要显式指定-O0。
问题7:GDB不识别Fortran数组语法
- 现象:在GDB调试控制台中,想打印数组
arr(1:5),但GDB报错。 - 原因:GDB默认可能使用C语法。
- 解决:在GDB中,可以设置语言为Fortran:在调试控制台输入
set language fortran。之后就可以使用Fortran的数组切片语法了,如print arr(1:5)。你也可以将这个命令添加到launch.json的setupCommands中,使其在每次调试开始时自动执行。
配置一个顺手的开发环境,是高效工作的第一步。对于Fortran这样历史悠久但在特定领域不可或缺的语言,在VSCode中为其打造一个现代化的“家”,不仅能让你更轻松地应对遗留代码,也能让你在编写新代码时享受到接近现代语言的便利。这个过程本身,也是对这门语言编译、链接、模块化机制的一次深入理解。从单文件编译到多项目管理,从基础编辑到断点调试,这套配置方案已经覆盖了中小型Fortran项目开发的大部分场景。剩下的,就是把你领域的科学计算逻辑,用这门古老而强大的语言实现出来了。
本文还有配套的精品资源,点击获取