大家
如果同一目标属于不同的目标,如何设置不同的先决条件。例如, 目标t1取决于文件main.o和t1.o,其中main.o依赖于t1.o(它是fortran中的模块文件,类似于C中的头文件.h),除了它的源, 目标t2取决于文件main.o和t2.o,此时main.o依赖于t2.o和它的源文件。
即
t1 : main.o t1.o
main.o: t1.o
t2:main.o t2.o
main.o: t2.o
我在一个makefile中一起编写它们,但不幸的是,main.o的dependece没有生效。为什么呢?
-
1 .SECONDEXPANSION:
2
3 FC=gfortran
4 PRJ = t1 t2
5
6 all: $(PRJ)
7
8 %.o:%.f90 ; $(FC) -c $<
9
10
11 t1: tname = t1.o
12 t2: tname = t2.o
13
14 $(PRJ) : main.o $$(tname) ; $(FC) $^ -o $@
15 main.o : $$(tname)
16
17 clean:
18 rm -rf $(PRJ) *.o *.mod
第15行不生效。为什么呢?
这是源文件:
main.f90时
use eqn
print *,nam
end
t1.f90
module eqn
character(10):: nam = 't1'
end module
t2.f90
module eqn
character(10):: nam = 't2'
end module
答案 0 :(得分:0)
target-specific vairable
实际上正在运行,如果您运行make t1
,然后运行make clean
,那么make t2
(它可以在我的电脑上运行)。但是,当您运行make
或make all
时,情况并非如此。这是因为有多个目标,我猜测只生成了一个目标main.o
(对此部分不太确定)
运行make
或make all
时,依赖关系图可能是这样的:
t1 t2
|\ / |
| +-> main.o <-+ |
| |
t1.o t2.o
检查以下内容:
GNU make does its work in two distinct phases. .....constructs a dependency graph
of all the targets and their prerequisites. During the second phase, make uses
these internal structures to determine what targets will need to be rebuilt and
to invoke the rules necessary to do so.
和
immediate : immediate ; deferred
deferred
That is, the target and prerequisite sections are expanded immediately
(来自this)