如何从特定的目标文件制作特定的二进制文件

时间:2013-04-08 06:55:52

标签: makefile gnu-make

这是我的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

1 个答案:

答案 0 :(得分:2)

在这条规则中:

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

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

这样做:

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

或者这样:

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