ifort 是 Intel oneAPI DPC++/C++ Compiler 和 Intel Fortran Composer 中包含的 Fortran 编译器,它功能强大,性能优异,是科学计算和高性能计算领域的常用工具。

检查 ifort 是否已安装
在运行 ifort 之前,首先需要确认它已经正确安装在你的系统中,你可以使用以下命令:
which ifort
如果已安装,它会返回 ifort 命令的完整路径,/opt/intel/oneapi/compiler/latest/linux/bin/ifort。
如果命令未找到,你需要先安装它,Intel 提供在线安装包或离线安装包,安装完成后,你可能需要配置环境变量(特别是 PATH),以便系统能找到 ifort。
ifort 命令的基本语法
ifort 命令的基本格式如下:

ifort [选项] 文件名1 [文件名2 ...] -o 输出文件名
[选项]: 控制编译过程的各种参数,例如优化级别、警告信息、调试信息等。文件名1 [文件名2 ...]: 一个或多个需要编译的 Fortran 源代码文件(.f,.f90,.F90等)。-o 输出文件名: 指定生成的可执行文件的名称,如果省略,默认输出为a.out。
常用编译选项
以下是 ifort 最常用的一些选项,分为几类以便理解。
1 基本选项
| 选项 | 全称 | 描述 |
|---|---|---|
-c |
compile |
只编译不链接,生成目标文件(.o 文件),不生成可执行文件。 |
-S |
assembly |
生成汇编代码,输出 .s 文件,而不是目标文件或可执行文件。 |
-E |
preprocess |
只进行预编译,处理 #include 和宏定义,输出到标准输出。 |
-o <file> |
output |
指定输出文件名。-o my_program。 |
-g |
debug |
生成调试信息,使用 GDB 等调试器时必需。 |
-v |
version |
显示详细版本信息,包括编译器版本、库路径等。 |
示例:
# 编译单个源文件,生成可执行文件 my_program ifort my_program.f90 -o my_program # 只编译,生成 my_program.o 文件 ifort -c my_program.f90 # 生成带调试信息的可执行文件 ifort -g my_program.f90 -o my_program_debug
2 优化选项
| 选项 | 级别 | 描述 |
|---|---|---|
-O0 |
无优化 | 不进行优化,编译速度最快,便于调试。 |
-O1 |
基本优化 | 进行基本的优化,提高代码运行速度。 |
-O2 |
标准优化 | 默认的优化级别,在性能和编译时间之间取得良好平衡。 |
-O3 |
高级优化 | 启用更激进的优化,可能显著提升性能,但会增加编译时间,并可能使调试困难。 |
-Ofast |
超越标准 | 在 -O3 的基础上,可能开启一些不符合标准的优化(如改变浮点运算顺序),可能影响数值精度。 |
示例:
# 使用 O2 级别优化(推荐用于发布版) ifort -O2 my_program.f90 -o my_program # 使用最高级别优化,追求极致性能 ifort -O3 my_program.f90 -o my_program_fast
3 警告信息选项
| 选项 | 描述 |
|---|---|
-w |
关闭所有警告信息。 |
-W0 |
显示所有警告信息(默认)。 |
-Wall |
启用一组常用的、被认为是有问题的警告。强烈建议在开发时使用。 |
-Wcheck |
启用运行时检查,如数组越界、未初始化变量等,对调试非常有帮助,但会轻微影响性能。 |
示例:

# 编译时显示所有警告,并进行运行时检查 ifort -Wall -Wcheck my_program.f90 -o my_program
4 预处理选项
| 选项 | 描述 |
|---|---|
-D<macro> |
定义宏,相当于在代码中 #define <macro> 1。-DNDEBUG 禁用断言。 |
-U<macro> |
取消定义宏,相当于 #undef <macro>。 |
-I<dir> |
添加包含目录,告诉编译器去哪里查找 include 文件。-I./include。 |
示例:
# 定义 DEBUG 宏,并添加自定义头文件目录 ifort -DDEBUG -I./include my_program.f90 -o my_program
编译流程示例
假设我们有以下两个文件:
constants.f90 (一个模块文件)
module constants
implicit none
integer, parameter :: dp = kind(1.0d0)
real(dp), parameter :: PI = 3.141592653589793_dp
end module constants
main.f90 (主程序文件)
program main
use constants
implicit none
real(dp) :: radius, area
print *, "Enter the radius of the circle:"
read *, radius
area = PI * radius * radius
print *, "The area of the circle is:", area
end program main
编译步骤:
-
分别编译(推荐用于大型项目) 这种方式可以只重新修改过的模块,提高编译效率。
# 1. 只编译模块文件,生成 constants.o ifort -c constants.f90 # 2. 编译主程序文件,并链接 constants.o,生成最终可执行文件 ifort main.f90 constants.o -o circle_area
-
一次性编译 如果文件不多,可以直接一次性编译所有文件。
ifort main.f90 constants.f90 -o circle_area
-
运行可执行文件
./circle_area
使用 Makefile 进行自动化编译
对于包含多个源文件的项目,手动管理编译命令非常繁琐。Makefile 是标准的解决方案。
创建一个名为 Makefile 的文件:
# 编译器设置
FC = ifort
FFLAGS = -O2 -Wall -Wcheck -g
# 目标文件
TARGET = circle_area
OBJS = main.o constants.o
# 默认目标
all: $(TARGET)
# 链接规则:如何从目标文件生成可执行文件
$(TARGET): $(OBJS)
$(FC) $(FFLAGS) -o $@ $^
# 编译规则:如何从 .f90 文件生成 .o 文件
%.o: %.f90
$(FC) $(FFLAGS) -c $< -o $@
# 清理规则
clean:
rm -f $(OBJS) $(TARGET)
.PHONY: all clean
使用方法:
make: 执行all目标,编译整个项目。make clean: 删除所有编译生成的.o文件和可执行文件。
这个 Makefile 定义了编译器、通用编译选项、目标文件和可执行文件名,并自动处理了 .f90 到 .o 的编译过程。
高级与特定选项
- 并行计算:
-qopenmp(或-fopenmp) 用于启用 OpenMP 并行。ifort -qopenmp -O3 my_parallel_program.f90 -o my_parallel_program
- 链接外部库:
-L<lib_dir>指定库路径,-l<lib_name>链接库(去掉lib前缀和.a/.so后缀)。# 假设有一个自定义库 libmymath.a 在 /usr/local/lib ifort my_program.f90 -L/usr/local/lib -lmymath -o my_program
- 固定格式 vs 自由格式: 默认情况下,
.f是固定格式,.f90是自由格式,你可以用-fixed或-free强制指定。
| 任务 | 命令示例 |
|---|---|
| 基本编译 | ifort code.f90 -o my_app |
| 调试编译 | ifort -g code.f90 -o my_app |
| 优化编译 | ifort -O2 code.f90 -o my_app |
| 显示警告 | ifort -Wall code.f90 -o my_app |
| 只编译不链接 | ifort -c code.f90 |
| 链接库 | ifort code.f90 -L/path/to/lib -lmylib -o my_app |
| 使用 Makefile | make |
掌握这些基本命令和选项,你就可以在 Linux 环境下高效地使用 ifort 编译你的 Fortran 程序了,建议从 -O2 -Wall -g 这组选项开始,它能在开发效率和代码质量之间取得很好的平衡。
