通用Makefile构建目录错误

时间:2017-02-09 17:06:47

标签: makefile directory gnu-make

我有一个虚拟C项目的目录结构。

.
├── inc
│   ├── getmsg.c
│   └── getmsg.h
├── makefile
└── src
    └── main.c

我当前的通用Makefile在下面,

TARGET = main

# finds all .c files, inc/getmsg.c src/main.c
SOURCES := $(shell find * -name *.c)
# converts all .c files to .o files, inc/getmsg.o src/main.o
OBJECTS := $(SOURCES:.c=.o)  
# directories that contain .h files for gcc -I flag, inc/
HEADERS := $(dir $(shell find * -name *.h))

CC     = gcc
CFLAGS = -Wall -std=c99 -iquote "$(HEADERS)"

all: $(TARGET)

%.o: %.c
    $(CC) $(CFLAGS) -c $< -o $@

$(TARGET): $(OBJECTS)
    $(CC) -o $@ $^

clean:
    rm -rf $(shell find * -name *.o) $(TARGET)

这一切都很好编译,但它只是将.o文件转储到与其相应的.c文件相同的目录中。

我想要做的是将所有目标文件放入构建目录中。为此,我将OBJECTS更改为OBJECTS := $(patsubst %,build/%,$(notdir $(SOURCES:.c=.o))),其中列出了文件build/getmsg.o build/main.o。然后我将%.o目标设置为build/%.o: %.c

然而,

然后返回No rule to make target 'build/getmsg.o'。因此make文件无法构建.o文件。我在这里缺少什么?

1 个答案:

答案 0 :(得分:0)

尝试更改

%.o: %.c

build/%.o: %.c