Fortran:包含已编译模块的生成文件 [英] Fortran: makefile with already compiled modules

查看:0
本文介绍了Fortran:包含已编译模块的生成文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个这样的项目结构

-Project

 --Common

  ---types.f90

  ---global.f90

  ---common_routines.f90

 --Program 1

  ---program1.f90

  ---module1.f90

  ---module2.f90

  ---etc...

 --Program 2

 --etc...
其中,Common是包含在所有程序之间共享的一些模块的文件夹。如何在我的Makefile中包含此模块?

我尝试过:

FC = gfortran
FCFLAGS = -fbounds-check -O3
FCFLAGS += -I ../Common

all: program1

program1: module1.o module2.o module3.o

program1.o: module1.o module2.o module3.o

module2.o: module1.o

module3.o: module2.o module1.o

%: %.o
    $(FC) $(FCFLAGS) -o $@ $^ 

%.o: %.f90
    $(FC) $(FCFLAGS) -c $<

clean:
    rm -rf *.o *.mod

但我收到对公共模块变量的未定义引用错误。

推荐答案

我尝试了FCFLAGS+=-i../Common typlees.o global al.o Common_routines.o

这将不起作用,因为-I是GNU Fortran预处理器的一个选项 指定预处理器搜索要包含的文件的路径 在编译之前。不能使用它指定对象文件(*.o)所在的路径 将在编译后由链接器搜索。这对我来说毫无意义 链接器,并且不会传递给链接器。

为简单起见,我们假设您需要链接的目标文件 program1只是program1/program1.o加上预先存在的common/types.ocommon/global.ocommon/common_routines.o

然后将以下Makefile放入目录program1,将构建它:

OBJS = program1.o ../common/types.o ../common/global.o ../common/common_routines.o

.phony: all

all: program1

program1: program1.o
    $(FC) -o $@ $(FCFLAGS) $(OBJS) 

clean:
    rm -f *.o program1

只需向链接器列出所有必需的目标文件,在本例中通过$(OBJS)

您可能希望采取预防措施,确保公共模块 在您构建program1之前是最新的,现在您可能认为您可以做到这一点 只需替换:

program1: program1.o

使用:

program1: $(OBJS)

从而提示make重新编译已退出的四个目标文件中的任何 与相应的源文件相关的日期,作为 建筑program1

make当然会努力做到这一点,但要小心。那样的话,它就会 重新编译,比如说,从../common/types.f90重新编译 从.f90生成.o的隐式默认配方,因为此生成文件是 没有告诉它做任何不同的事情。但这可能不是 ../common/types.f90用于编译,如果您在common中也有一个生成文件 这规定了如何以某种非默认方式执行此操作。

在这种情况下,公共目标文件应始终按照 common中的生成文件。最好保留program1的前提条件,但将配方更改为:

program1: program1.o
    $(MAKE) -C ../common
    $(FC) -o $@ $(FCFLAGS) $(OBJS)
现在,只要program1需要重建,配方将在../common中抢先运行 在它链接这四个目标文件之前。(这是一个小小的不雅,$(MAKE) -C ../common 将被调用,即使它无事可做:这可以通过更高级的make用法来避免)。

最后,您可能还需要(如果不是在这种情况下,那么在另一种情况下)区分 传递给预处理的标志和/或传递给编译的标志和/或传递给链接的标志。 通常,这些被分配给不同的make变量,例如FPPFLAGS(预处理器), FCFLAGS(编译器),LDFLAGS(链接器)。

这篇关于Fortran:包含已编译模块的生成文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆