面试题答案
一键面试- Makefile基础配置
- 定义变量:
- 首先,在Makefile中定义一些常用变量,例如:
- 定义变量:
FC = gfortran # Fortran编译器,可根据实际情况修改
FFLAGS = -Wall -g # 编译选项,-Wall开启所有警告,-g添加调试信息
LDFLAGS = # 链接选项,如有特殊库链接需求在此设置
SRCS = main.f90 module1.f90 module2.f90 # 列出所有源文件
OBJS = $(SRCS:.f90=.o) # 将源文件扩展名.f90替换为.o,得到目标文件列表
EXEC = my_program # 生成的可执行文件名称
- 编译规则:
- 定义编译单个源文件为目标文件的规则:
%.o: %.f90
$(FC) $(FFLAGS) -c $< -o $@
- 这里`$<`表示依赖文件(即源文件),`$@`表示目标文件(即生成的.o文件)。此规则会对所有`.f90`源文件自动应用,将其编译为`.o`目标文件。
- 链接规则:
- 定义将所有目标文件链接成可执行文件的规则:
$(EXEC): $(OBJS)
$(FC) $(LDFLAGS) $^ -o $@
- 其中`$^`表示所有依赖文件(即所有`.o`目标文件)。
2. 处理模块依赖关系
- 模块编译顺序:
- Fortran模块需要先编译,因为其他使用该模块的源文件依赖于模块生成的
.mod
文件。例如,如果module1.f90
定义了一个模块,main.f90
使用了这个模块,那么module1.f90
应先编译。在Makefile中,由于定义了通用的编译规则,只要源文件之间的依赖关系通过use
语句正确声明,Make工具会根据依赖关系自动确定编译顺序。
- Fortran模块需要先编译,因为其他使用该模块的源文件依赖于模块生成的
- 模块搜索路径:
- 如果模块文件(
.mod
)不在默认路径下,需要通过-I
选项指定模块搜索路径。例如,如果模块文件在modules
目录下,修改FFLAGS
为:
- 如果模块文件(
FFLAGS = -Wall -g -Imodules
- 清理规则:
- 为了方便清理编译生成的文件,添加清理规则:
clean:
rm -f $(OBJS) $(EXEC) *.mod
- 这样执行
make clean
时,会删除所有目标文件、可执行文件和模块文件。
通过上述Makefile配置,可以实现Fortran项目中多个源文件的编译与链接,并妥善处理模块依赖关系。