0

次のようなオブジェクトファイルがあります。

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

すべての task*.o を 2 つの 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

私は何を間違っていますか?

4

1 に答える 1

2

ここ:

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

すべてのオブジェクトから実行可能ファイルを作成しています。代わりに、静的パターン ルールを使用する必要があります (既に で使用しているものと同様)。$(TASK_OBJECTS)

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

$^( 「すべての前提条件」の自動変数であることに注意してください。)

于 2013-03-20T12:39:34.137 に答える