必须带-g参数才能调试,gfortran默认编译产物无调试信息,导致vscode断点失效或变量显示optimized out;modern fortran插件仅调用gfortran,不自动生成调试信息。

gfortran 编译参数必须带 -g 才能调试
VSCode 里点 F5 调试却停不住断点,或者变量显示为 (optimized out),基本就是没加 -g。Modern Fortran 插件不生成调试信息,它只调用 gfortran;而 gfortran 默认编译出来的二进制是剥离符号的,GDB 根本看不到源码行和局部变量。
-
gfortran -o main main.f90→ 可运行,但无法调试 -
gfortran -g -o main main.f90→ 可调试,支持断点、变量监视、调用栈回溯 - 额外建议加上
-Wall捕获隐式声明、未使用变量等常见 Fortran 陷阱 - 若项目含 OpenMP,需加
-fopenmp;用 NetCDF 或 MPI,对应加-lnetcdff或-lmpi
运行时库链接失败常见报错与修复
执行 ./main 时出现 error while loading shared libraries: libgfortran.so.5: cannot open shared object file(Linux)或 The program can't start because libgfortran-5.dll is missing(Windows),说明运行时库没被系统找到。
- Linux:检查
gfortran --print-file-name=libgfortran.so输出路径,把对应目录加进LD_LIBRARY_PATH,例如:export LD_LIBRARY_PATH="/usr/lib/gcc/x86_64-linux-gnu/11:$LD_LIBRARY_PATH" - Windows(MinGW-w64):确保
gfortran.exe所在目录(如C:\msys64\mingw64\bin)已在系统PATH中;该目录下必须存在libgfortran-5.dll等文件 - macOS:Homebrew 安装的
gcc会把库放在/opt/homebrew/lib,需确认DYLD_LIBRARY_PATH包含该路径,或用install_name_tool重写可执行文件的库路径 - 静态链接可绕过此问题:
gfortran -static-libgfortran -g main.f90 -o main,但会增大二进制体积
Code Runner 默认不链接数学库,sin/sqrt 等函数可能报 undefined reference
用 Code Runner 直接运行含数学函数的代码,编译时报 undefined reference to `sqrt',是因为 gfortran 默认不自动链接 libm —— 这和 C 不同,Fortran 的 intrinsic 函数理论上无需显式链接,但某些配置或旧版工具链会漏掉。
- 临时解决:改
settings.json中的code-runner.executorMap,把命令补全:"fortran": "gfortran -g -lm $fileName -o $fileNameWithoutExt && ./$fileNameWithoutExt" - 更稳妥做法:用
tasks.json自定义构建任务,明确指定-lm,避免依赖 Code Runner 的简陋模板 - 注意:
-lm必须放在源文件之后,即gfortran -g main.f90 -lm -o main有效,gfortran -g -lm main.f90 -o main在部分系统上会失效
Fortran 预处理文件(.F90)需显式启用宏展开
打开 model.F90(大写 F)后,#ifdef、#include 不生效,语法高亮错乱,甚至编译失败,是因为 Modern Fortran 扩展默认不启用预处理器。
-
.f90(小写)→ 自由格式,直接编译 -
.F90(大写)→ 视为需预处理的文件,但扩展默认跳过cpp步骤 - 必须在
.vscode/settings.json中开启:"fortran.preprocessor.enabled": true - 若用自定义宏定义(如
-DDEBUG),还需配"fortran.preprocessor.args": ["-DDEBUG"] - 注意:预处理后生成的临时文件不会保存,仅用于语法分析和编译流程
-g 决定能不能调试,-lm 决定数学函数认不认得,大小写决定预处理器开不开。这些不是可选项,是每个 Fortran 文件在 VSCode 里真正跑起来前,必须亲手核对的硬性条件。











