2

我有以下问题。我有一组 Fortran90 源文件,其中大部分包含模块。我必须用它们构建一个静态库(.a),并且我使用了以下 Makefile。

.SUFFIXES: .o .c .f90 .f .mod

DEPSF =   tt_f90m, bt
include Makefile.in #Contains compiler flags (CC, FORT, etc.)
OBJS    = $(DEPSF:,=.o).o

mytt.a: $(OBJS) 
 ar rc mytt.a $(OBJS)
.f90.o:
    $(FORT) -c $<

它工作正常,但它有一个烦人的特性:如果我编辑任何源文件,mytt.a 目标不会重建。只有当我删除所有 .o 和 .mod 文件时,它才会发生。make -d 的输出

如下:

....


Considering target file `tt_f90m.o'.
....   
Found an implicit rule for `tt_f90m.o'.
Considering target file `tt_f90m.mod'.
 Looking for an implicit rule for `tt_f90m.mod'.
....
 No implicit rule found for `tt_f90m.mod'.
 Finished prerequisites of target file `tt_f90m.mod'.
No need to remake target `tt_f90m.mod'.
Finished prerequisites of target file `tt_f90m.o'.
Prerequisite `tt_f90m.mod' is older than target `tt_f90m.o'.
No need to remake target `tt_f90m.o'.

我怎样才能正确编写这个makefile?

4

2 回答 2

2

事实上,我有这个问题的答案。问题出在 Fortran90 上。它具有 .mod 文件作为依赖项,因此如果源文件发生更改,则 .mod 文件不会,并且文件不会重新编译。解决方案非常简单。一开始只写

.SUFFIXES:
.SUFFIXES: .c .f .f90 .F90 .o

仅此而已!

于 2012-06-16T08:14:52.890 回答
1

您没有将文件.f90.f文件的依赖关系.mod放入您的makefile中。.f如果您更新以,.mod或结尾的文件之一.c,make 不会看到您的.a文件依赖于它,并且不会费心重新编译该.f90文件。

你有几个选项来解决这个问题。一种是使用makedepend之类的工具。Makedepend 本身仅适用于 C,但存在 fortran 版本。

另一种是在您的makefile 中明确声明哪些目标文件取决于哪些模块和C 文件。它看起来有点像这样:

.SUFFIXES: .o .c .f90 .f .mod

DEPSF =   tt_f90m, bt
include Makefile.in #Contains compiler flags (CC, FORT, etc.)
OBJS    = $(DEPSF:,=.o).o

mytt.a: $(OBJS) 
    ar rc mytt.a $(OBJS)

ttf90m.o: bt.f90 foo.mod bar.f
    $(FORT) -c $< -o $@

bt.o: ttf90m.f90 baz.mod floop.c
    $(FORT) -c $< -o $@    
于 2012-05-19T23:15:15.253 回答