c - Makefile 混淆虚假 hack

标签 c makefile

文件夹结构:

  • 生成文件
  • 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/

相关文章:

build - 使 : disable parallel building in subdirectory for single target only

c++ - "Recursive Makefile Considered Harmful"样式 makefile 问题

将 png 转换为 sdl 的 c header

c - 需要帮助在C中使用if else循环创建菜单

c++ - 对符号 'pthread_create@@GLIBC_2.2.5' 的 undefined reference

makefile - 在 'all'中创建多个目标

makefile - 使用 Jade - 需要一个 makefile 命令将源 Jade 编译到公共(public)目录并维护源目录结构

c++ - window平台下c获取进程状态

在 if 语句之前运行的 c 系统调用

c - 使用预处理器避免读/写函数中的代码重复