Fortran:包含已编译模块的生成文件 [英] Fortran: makefile with already compiled modules
本文介绍了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.o
,
common/global.o
和common/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屋!
查看全文