Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在makefile中获得.mod的正确顺序_Makefile_Fortran - Fatal编程技术网

如何在makefile中获得.mod的正确顺序

如何在makefile中获得.mod的正确顺序,makefile,fortran,Makefile,Fortran,我正在尝试用Fortran为我的项目创建一个Makefile,并使其可用于现在的项目。经过多次尝试,我得到的Mkefile如下。问题是,它在少数情况下工作正常,但现在我有以下文件: main.f90,initial.f90,parameters.f90,functions.f90 第一个是我的程序,其他的是我有子程序的模块。问题是initial需要参数才能工作,但是Makefile决定先编译initial,然后再编译参数。有没有办法让我按照正确的顺序选择它们 vpath %.o obj vpat

我正在尝试用Fortran为我的项目创建一个Makefile,并使其可用于现在的项目。经过多次尝试,我得到的Mkefile如下。问题是,它在少数情况下工作正常,但现在我有以下文件:

main.f90,initial.f90,parameters.f90,functions.f90

第一个是我的程序,其他的是我有子程序的模块。问题是initial需要参数才能工作,但是Makefile决定先编译initial,然后再编译参数。有没有办法让我按照正确的顺序选择它们

vpath %.o obj
vpath %.mod mod 

TOP_DIR = .
MOD_DIR = $(TOP_DIR)/mod
OBJ_DIR = $(TOP_DIR)/obj

SOURCES = $(wildcard *.f90)
OBJECTS := $(patsubst %.f90, $(OBJ_DIR)/%.o, $(SOURCES))
ALL_MODULES = $(patsubst %.f90, %.mod, $(SOURCES))
MODULES = $(filter-out main.mod, $(ALL_MODULES))

FFLAGS = -O3 -J$(MOD_DIR) -march=native  -fimplicit-none  -Wall  -Wline-truncation  -fwhole-file  

.PHONY: main clean

main: main.out
./main.out

main.out: $(MODULES) $(OBJECTS)
gfortran $(FFLAGS) $(OBJECTS) -o main.out

$(OBJ_DIR)/%.o : %.f90
gfortran  $(FFLAGS) $^ -c $@

%.mod: %.f90
gfortran  $(FFLAGS) -c $^

clean:
rm -f $(OBJ_DIR)/*.o *.out $(MOD_DIR)/*.mod

按依赖关系顺序列出源文件,而不是自动列出:
SOURCES=parameters.f90 initial.f90 functions.f90

将模块和程序的源代码分开:
main.f90
通常不会生成
.mod
文件,这将破坏您所拥有的过于简单的Makefile


我还建议使用另一个构建系统(例如cmake),但对于小型项目,如果愿意,您可以使用Makefile。

使用现代Fortran编译顺序非常重要。当使用makefiles时,对于任何非琐碎的事情来说,手动跟踪依赖关系都太单调乏味了。输入各种工具以生成这些依赖项列表。我已经成功地使用了
makedepf90
,它在EPEL(RHEL/CentOS)和Debian/Ubuntu中作为一个包提供

如果将依赖项列表保存在单独的文件中,您甚至可以为重新生成依赖项列表制定makefile规则,如:

include depend.mk

# Dependencies generated by "makedepf90" tool.
depend depend.mk:
        cd $(srcdir) && makedepf90 $(yourprogramname_SOURCES) >depend.mk

上述BTW既适用于普通makefiles,也适用于automake(在这种情况下,您可以将上面的代码片段放在Makefile.am中)

正如我多次评论的那样,makefiles完全不适用于现代Fortran,并导致了这些问题。即使只修复一次,在项目中添加任何新文件都是一件非常痛苦的事情。有许多现代的替代方案可用:cmake、scons、fobis、waf……如果您真的必须使用Make,您可以尝试从源代码解析依赖项,并告诉
Make
使用它们。请参阅例如和。@VladimirF您必须以某种方式在这些工具中对依赖顺序进行编码。@Vroomfondel不是这样,这些工具能够扫描源文件并自动确定顺序。@VladimirF您当然是对的,但在我的意思中,这包含在“以某种方式”中,因为这种树的生成与这些工具的其他功能完全无关;遗憾的是,生成工具链的这一步骤从未得到应有的重视。在我的职业生涯中,我遇到了无数由半个$$ed构建工具造成的Desaster,其中只有一个干净的依赖关系树实现加上make就可以带来所有的不同。