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

标签 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

最佳答案

在这条规则中:

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

每个 可执行文件都依赖于所有 对象。自 $<只捕获第一个先决条件,你看到的是obj/task1.o .

这样做:

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

或者这样:

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

关于makefile - 如何从特定的目标文件制作特定的二进制文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15873011/

相关文章:

c - Gnu Make 在打开头文件中的 Pren 时抛出错误

makefile - GNU makefile 中是否可以有多个 .PHONY 目标?

makefile - 如何在运行 make 时添加额外的标志?

c - 如果从 shell 脚本调用,则使文件环境变量不生效

string - Makefile:返回字符串的前两个字符

linux - 如何在 Makefile 中设置同时适用于 Windows 和 Linux 平台的 CC 和 AR?

c++ - Makefile 改进,依赖生成不起作用

linux - 我的 Makefile 有问题吗?

c - GDB 看不到除 main 之外的源文件,这是由 makefile 引起的吗?

c - 没有制定目标的规则