对象文件到不同的可执行文件

时间:2013-03-20 12:16:07

标签: makefile

我有以下对象文件:

  

task1.o task2.o task3.o task4.o tasks.o comm.o

我需要将每个任务* .o与两个tasks.o comm.o链接起来。 手动它看起来像:

  

gcc -Wall -o task1 task1.o tasks.o comm.o

     

gcc -Wall -o task2 task2.o tasks.o comm.o

所以在结果中我将有4个可执行文件,task1.exe等,但是当我尝试使用makefile执行此操作时:

TASKS= task1 task2 task3 task4
TASK_OBJECTS= task1.o task2.o task3.o task4.o
OBJS_SOURCES= tasks.c comm.c
OBJS= tasks.o comm.o
CC=gcc
CFLAGS= -Wall -c -o 

all: $(TASKS)

$(TASKS): $(TASK_OBJECTS) $(OBJS)
    $(CC) -o $@ $(TASK_OBJECTS) $(OBJS)
$(TASK_OBJECTS): %.o: %.c
    $(CC) $(CFLAGS) $@ $<
$(OBJS): %.o: %.c
    $(CC) $(CFLAGS) $@ $<
clean:
    rm -rf *.o task1 task2 task3 task4

我明白了:

gcc -Wall -c -o  task1.o task1.c
gcc -Wall -c -o  task2.o task2.c
gcc -Wall -c -o  task3.o task3.c
gcc -Wall -c -o  task4.o task4.c
gcc -Wall -c -o  tasks.o tasks.c
gcc -Wall -c -o  comm.o comm.c
gcc -o task1 task1.o task2.o task3.o task4.o tasks.o comm.o

而不是

gcc -Wall -c -o  task1.o task1.c
gcc -Wall -c -o  task2.o task2.c
gcc -Wall -c -o  task3.o task3.c
gcc -Wall -c -o  task4.o task4.c
gcc -Wall -c -o  tasks.o tasks.c
gcc -Wall -c -o  comm.o comm.c
gcc -o task1 task1.o tasks.o comm.o
gcc -o task2 task2.o tasks.o comm.o
gcc -o task3 task3.o tasks.o comm.o
gcc -o task4 task4.o tasks.o comm.o

我做错了什么?

1 个答案:

答案 0 :(得分:2)

下面:

$(TASKS): $(TASK_OBJECTS) $(OBJS)
    $(CC) -o $@ $(TASK_OBJECTS) $(OBJS)

您正在从所有对象构建每个可执行文件。相反,您应该使用静态模式规则(就像您已经用于$(TASK_OBJECTS)的规则):

$(TASKS): % : %.o $(OBJS)
    $(CC) -o $@ $^

(注意$^是“所有先决条件”的自动变量。)

相关问题