Makefile具有自动依赖性

Nic*_*ick 2 c makefile

假设我们有以下设置:

prog.c中

#include <stdio.h>

#include "prog.h"

int main(){
        printf("%s\n", HELLO);

        return 0;
}
Run Code Online (Sandbox Code Playgroud)

prog.h

#ifndef _PROG_H
#define _PROG_H

#define HELLO "hello world"

#endif
Run Code Online (Sandbox Code Playgroud)

Makefile文件

(注意我简化了Makefile以使问题更加明显)

MYCC    = gcc

CC      = $(MYCC) -MMD -MP -c

LINK    = $(MYCC) -o

TARGETS = prog

all:    $(TARGETS)

clean:
        rm -f *.o *.d $(TARGETS)

prog: prog.o
        $(LINK) $@ $^

%.o: %.c
        $(CC) $<

-include $(SRC:%.c=%.d)
Run Code Online (Sandbox Code Playgroud)

这个makefile假设在第一次运行后自动创建依赖项(*.d文件).

然而有些事情是错误的,因为如果我更改.h文件,它根本不会重建项目.

[nmmm@zenbook ctest]$ make
gcc -MMD -MP -c prog.c
gcc -o prog prog.o
[nmmm@zenbook ctest]$ ./prog 
hello world
[nmmm@zenbook ctest]$ touch prog.c 
[nmmm@zenbook ctest]$ make
gcc -MMD -MP -c prog.c
gcc -o prog prog.o
[nmmm@zenbook ctest]$ touch prog.h
[nmmm@zenbook ctest]$ make    << here is the problem
make: Nothing to be done for 'all'.
Run Code Online (Sandbox Code Playgroud)

prog.d 看起来不错.

我做错了什么?

Bar*_*rry 6

你永远不会在SRC任何地方定义 如果您明确设置它:

SRC = prog.c
Run Code Online (Sandbox Code Playgroud)

或使用通配符:

SRC = $(wildcard *.c)
Run Code Online (Sandbox Code Playgroud)

一切都适合我.