文件夹结构:
Makefile(相关部分):
22.222223
命令:
%.c:
echo 'Building $@ for $(PLATFORM)...'
$(CC) $(CFLAGS) $@ -o '$(DESTDIR)/$*'
问题 - 给了我输出:
make rect_01.c PLATFORM=FOO
所以我尝试了一个hack并添加了一个依赖项,我添加到.Phony, 这样每次都应该执行%.c。但现在它试图编译我的 makefile即使它没有扩展名.c。
我写了以下更新的makefile(相关部分):
'rect_01.c up already to date'
这给了我以下输出:
.PHONY: phonyDummy
%.c: phonyDummy
echo 'Building $@ for $(PLATFORM)...'
$(CC) $(CFLAGS) $@ -o '$(DESTDIR)/$*'
你能解释一下这种行为吗?
答案 0 :(得分:0)
您应该了解有关Makefile
的更多信息。你混合了两件重要的事情:目标和依赖。
目标是应该使用规则创建的文件(在大多数情况下)。依赖性是"来源"。
如果你写:
%.c:
echo 'Building $@ for $(PLATFORM)...'
$(CC) $(CFLAGS) $@ -o '$(DESTDIR)/$*'
表示:"我想创建.c
扩展名为"的文件。您不想创建.c
个文件,因为您有很多(三个).c
个文件。 make
检查rect_01.c
:它是否存在且是最新的,因为它没有任何依赖关系(:
之后没有依赖关系任何东西)。
我认为您要构建rect_01.so
(或类似) - 这是目标!所以你想要类似的:
%.o: %.c
echo 'Building $@ for $(PLATFORM)...'
$(CC) $(CFLAGS) -o $@ $<
在这种情况下,如果您要构建rect_01.o
,则应运行make rect_01.o
。如果$(CC)
不存在或早于rect_01.o
,则rect_01.c
将会运行(因此来源rect_01.c
较新且尚未重建)。< / p>