从目标构建的问题 - Makefile
Problems with building from target - Makefile
这可能是一个非常愚蠢的问题,但我从来没有真正以复杂的方式使用过 Makefile,在我第一次尝试 "step it up" 我 运行 进入以下问题时:
我有 4 个目标,其中 运行 是我要调用来构建源代码的目标。
- 运行 > 主要目标
- exec > 构建可执行文件
- %.o > 应该编译源代码
- source > 连接源文件
原理结构如下:
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,所有 "missing" 对象都应该生成。不幸的是,我收到无法找到目标文件的错误 ifort: error #10236: File not found: 'file1.o'
(因为没有编译),现在我想知道我做错了什么?
感谢任何帮助!
您的 source
规则不正确。这些分配不应该在规则中。并且由于您正在对源名称进行硬编码,因此您也可以改为对对象名称进行硬编码:
OBJECTS := file1.o
OBJECTS += file2.o
...
接下来的两条规则看起来是正确的,但您可以在 exec
规则中使用 $^
:
exec: $(OBJECTS)
$(FC) $(FLAGS) -o $@ $^
%.o: %.f90
$(FC) -c $(FLAGS) -o $@ $<
那么run
规则(应该是第一个)可以这样:
run: exec
./$@
我不使用 Fortran,所以我没有测试过这个;如果它不起作用,请在评论中告诉我们确切的错误消息,我们将进行故障排除。
这可能是一个非常愚蠢的问题,但我从来没有真正以复杂的方式使用过 Makefile,在我第一次尝试 "step it up" 我 运行 进入以下问题时:
我有 4 个目标,其中 运行 是我要调用来构建源代码的目标。
- 运行 > 主要目标
- exec > 构建可执行文件
- %.o > 应该编译源代码
- source > 连接源文件
原理结构如下:
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,所有 "missing" 对象都应该生成。不幸的是,我收到无法找到目标文件的错误 ifort: error #10236: File not found: 'file1.o'
(因为没有编译),现在我想知道我做错了什么?
感谢任何帮助!
您的 source
规则不正确。这些分配不应该在规则中。并且由于您正在对源名称进行硬编码,因此您也可以改为对对象名称进行硬编码:
OBJECTS := file1.o
OBJECTS += file2.o
...
接下来的两条规则看起来是正确的,但您可以在 exec
规则中使用 $^
:
exec: $(OBJECTS)
$(FC) $(FLAGS) -o $@ $^
%.o: %.f90
$(FC) -c $(FLAGS) -o $@ $<
那么run
规则(应该是第一个)可以这样:
run: exec
./$@
我不使用 Fortran,所以我没有测试过这个;如果它不起作用,请在评论中告诉我们确切的错误消息,我们将进行故障排除。