文件夹结构:
- 生成文件
- rect_01.c
- rect_02.c
- square_01.c
Makefile(相关部分):
%.c:
echo 'Building $@ for $(PLATFORM)...'
$(CC) $(CFLAGS) $@ -o '$(DESTDIR)/$*'
命令:
make rect_01.c PLATFORM=FOO
问题 - 给了我输出:
'rect_01.c up already to date'
所以我尝试了一个 hack 并添加了一个依赖项,并将其添加到 .Phony 中, 这样每次都应该执行 %.c 。但现在它试图编译我的 makefile 即使它没有扩展名 .c。
我编写了以下更新的 makefile(相关部分):
.PHONY: phonyDummy
%.c: phonyDummy
echo 'Building $@ for $(PLATFORM)...'
$(CC) $(CFLAGS) $@ -o '$(DESTDIR)/$*'
这给了我以下输出:
make rect_01.c PLATFORM=LINUX_X86
echo 'Building Makefile.c for LINUX_X86...'
Building Makefile.c for LINUX_X86...
g++ -Wall -g Makefile.c -o '../Executables/Makefile'
Makefile: file not recognized: File format not recognized
Makefile:55: recipe for target 'Makefile.c' failed
make: *** [Makefile.c] Error 1
你能解释一下这种行为吗?
最佳答案
您应该了解有关 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
。如果 rect_01.o
不存在或早于 rect_01.c
,则 $(CC)
将运行(因此源 rect_01 .c
较新,尚未重建)。
关于c - Makefile 混淆虚假 hack,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41921888/