2

这是我的 makefile,我在 obj/ 目录中有目标文件,我需要将它们编译成 bin/ 文件夹中的二进制文件,但不知何故它不能像我希望的那样工作,有什么想法吗?

SOURCES= $(wildcard *.c)
OBJECTS:= $(patsubst %.c, %.o, $(SOURCES))
OBJECTS:= $(addprefix obj/,$(OBJECTS))
NAMES:= $(patsubst %.c, %, $(SOURCES))
NAMES:= $(addprefix bin/,$(NAMES))
CC=gcc
CFLAGS= -Wall -c -o
DIRS = bin obj

all: $(DIRS) $(NAMES)

$(NAMES): $(OBJECTS)
    $(CC) -o $@ $<

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

$(DIRS):
    mkdir -p $@

clean:
    rm -rf $(DIRS)

实际输出:

mkdir -p bin
mkdir -p obj
gcc -Wall -c -o obj/task1.o task1.c
gcc -Wall -c -o obj/task2.o task2.c
gcc -Wall -c -o obj/task3.o task3.c
gcc -o bin/task1 obj/task1.o
gcc -o bin/task2 obj/task1.o
gcc -o bin/task3 obj/task1.o

预期输出:

mkdir -p bin
mkdir -p obj
gcc -Wall -c -o obj/task1.o task1.c
gcc -Wall -c -o obj/task2.o task2.c
gcc -Wall -c -o obj/task3.o task3.c
gcc -o bin/task1 obj/task1.o
gcc -o bin/task2 obj/task2.o
gcc -o bin/task3 obj/task3.o
4

1 回答 1

2

在这个规则中:

$(NAMES): $(OBJECTS)
    $(CC) -o $@ $<

每个可执行文件都依赖于所有对象。而且由于$<只抓住了第一个先决条件,所以你看到的只是obj/task1.o.

这样做:

bin/%: obj/%.o
    $(CC) -o $@ $<

或者这样:

$(NAMES): bin/% : obj/%.o
    $(CC) -o $@ $<
于 2013-04-08T13:07:36.587 回答