Make仅识别已更改的对象

时间:2014-02-13 19:18:22

标签: makefile

我有点困惑。我有一个makefile来创建一个目标取决于一些对象。如果我更改其中一个对象并再次运行makefile,则仅创建已更改对象的链接。这当然会导致错误。我确定发生了这个错误,因为我的makefile不够清楚。那么有人可以告诉我什么是错的? 我想无论如何应该告诉make只要编译指定的对象,但是我需要像循环来创建对象。 ......我不知道。

Makefile:

F90=gfortran

SRCF=./src
OBJF=./objs
MODF=./mods
BINF=./bin

SOURCES=dep.f90 main.f90
OBJECTS=$(addprefix $(OBJF)/,$(addsuffix .o,$(basename $(SOURCES))))
MODULES=$(addprefix $(MODF)/,*.mod)
TARGET=main

$(BINF)/$(TARGET): $(OBJECTS)
    $(F90) -o$@ $? -J$(MODF) -I$(MODF)

clean :
    rm $(OBJECTS) $(MODULES) $(BINF)/$(TARGET)

$(OBJF)/%.o: $(SRCF)/%.f90
    $(F90) $(F90FLAGS) $(LDFLAGS) -c $< -o $@ -J$(MODF) -I$(MODF)

更改dep.f90后的错误:

gfortran   -c src/dep.f90 -o objs/dep.o -J./mods -I./mods
gfortran -obin/main objs/dep.o -J./mods -I./mods 
Undefined symbols for architecture x86_64:
  "_main", referenced from:
      start in crt1.10.5.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
make: *** [bin/main] Error 1

两个示例文件: main.f90时:

program test

use dep
implicit none
real::a,b,c

a=1e0
b=2e0

c=summe(a,b)

print*,c

end program

dep.f90

module dep
implicit none

contains

function summe(a,b) result(c)
real::a,b,c

c=a+b

end function summe
end module dep

1 个答案:

答案 0 :(得分:2)

这就是$?变量的意思:它只扩展到已更改的先决条件。编写您的规则以使用$^,它扩展到所有先决条件,而不是:

$(BINF)/$(TARGET): $(OBJECTS)
        $(F90) -o$@ $^ -J$(MODF) -I$(MODF)

有关详细信息,请参阅Automatic Variables