这可能是一个非常愚蠢的问题,但我从未真正以复杂的方式使用Makefiles,而且在我第一次尝试“加强”时遇到了以下问题:
我有4个目标,其中运行是我要调用以构建我的源代码的目标。
原则中的结构如下:
run: source exec
source:
$(eval SOURCE := file1.f90)
$(eval SOURCE += file2.f90)
...
$(eval OBJECTS := $(SOURCE:%.f90=%.o))
exec: $(OBJECTS)
$(FC) $(FLAGS) -o $@ $(OBJECTS)
%.o: %.f90
$(FC) -c $(FLAGS) -o $@ $<
从我从手册中理解的是,编译目标代表一个隐式规则,并且一旦调用 exec 就应该生成所有“缺失”对象。不幸的是,我收到了无法找到目标文件的错误ifort: error #10236: File not found: 'file1.o'
(因为没有编译),现在我想知道我做错了什么?
任何帮助表示赞赏!
答案 0 :(得分:2)
您的source
规则不正确。这些任务不应成为规则。由于您对源名称进行了硬编码,因此您也可以改为对代码名称进行硬编码:
OBJECTS := file1.o
OBJECTS += file2.o
...
接下来的两条规则看起来是正确的,但您可以在$^
规则中使用exec
:
exec: $(OBJECTS)
$(FC) $(FLAGS) -o $@ $^
%.o: %.f90
$(FC) -c $(FLAGS) -o $@ $<
然后run
规则(应该是第一个)可以是这样的:
run: exec
./$@
我不使用Fortran,所以我没有测试过这个;如果它不起作用,请在评论中告诉我们确切的错误消息,我们将进行故障排除。