我有点困惑。我有一个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
答案 0 :(得分:2)
这就是$?
变量的意思:它只扩展到已更改的先决条件。编写您的规则以使用$^
,它扩展到所有先决条件,而不是:
$(BINF)/$(TARGET): $(OBJECTS)
$(F90) -o$@ $^ -J$(MODF) -I$(MODF)
有关详细信息,请参阅Automatic Variables。