gpt4 book ai didi

makefile - Fortran Makefile 中目标文件 "*.o"的自动排序

转载 作者:行者123 更新时间:2023-12-04 03:43:37 26 4
gpt4 key购买 nike

这里我有两个 Fortran90 文件和一个 makefile:

文件内容 main_mod.f90 :

module main_mod

contains

subroutine add(a, b)
implicit none
integer, intent(in) :: a, b
print *, (a+b)
end subroutine add

end module main_mod

文件内容 main_mod2.f90
module main_mod2
use main_mod

contains

subroutine add2(a, b)
implicit none
integer, intent(in) :: a, b

call add(a, b)
end subroutine add2

end module main_mod2

生成文件 ,我自动从当前目录生成“.o”文件列表:
F90 = /usr/bin/gfortran
COMPFLAGS = -c
%.o: %.f90
$(F90) $(COMPFLAGS) $*.f90

all: $(patsubst %.f90,%.o,$(wildcard *.f90))

当我制作项目时,我的制作文件中的通配符语句会生成一个目标文件列表,例如:
main_mod2.o main_mod.o

然后编译失败,因为首先,需要编译文件 main_mod.f90,这将为我们提供 main_mod2.f90 中使用的 main_mod.o 和 main_mod.mod。然后 main_mod2.f90 将被成功编译。这意味着目标文件的排列必须是:
main_mod.o main_mod2.o

现在,问题是,一般情况下,当我使用通配符创建目标文件列表时,如何强制目标文件的正确排列?

最佳答案

虽然 gcc 确实有 -M以及使用 C/C++ 文件执行此操作的相关标志,不幸的是它们不适用于 gfortran。实际上,这是可能的,但前提是您已经知道依赖关系。
因此,您将需要一个外部程序来生成您的依赖项。

在我的项目中,我使用 this python script ,并将以下内容添加到我的生成文件中:

# Script to generate the dependencies
MAKEDEPEND=/path/to/fort_depend.py

# $(DEP_FILE) is a .dep file generated by fort_depend.py
DEP_FILE = my_project.dep

# Source files to compile
OBJECTS = mod_file1.f90 \
mod_file2.f90

# Make sure everything depends on the .dep file
all: $(actual_executable) $(DEP_FILE)

# Make dependencies
.PHONY: depend
depend: $(DEP_FILE)

# The .dep file depends on the source files, so it automatically gets updated
# when you change your source
$(DEP_FILE): $(OBJECTS)
@echo "Making dependencies!"
cd $(SRCPATH) && $(MAKEDEPEND) -w -o /path/to/$(DEP_FILE) -f $(OBJECTS)

include $(DEP_FILE)
fort_depend.py基本上只是列出所有模块 USE d 在给定的文件中。

关于makefile - Fortran Makefile 中目标文件 "*.o"的自动排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25705273/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com