2013-03-20 83 views
0

我有對象文件,如:目標文件不同的可執行文件

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

我需要連接的每任務* .o與兩個tasks.o comm.o. 手動它看起來像:

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

的gcc -o -Wall 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 [email protected] $(TASK_OBJECTS) $(OBJS) 
$(TASK_OBJECTS): %.o: %.c 
    $(CC) $(CFLAGS) [email protected] $< 
$(OBJS): %.o: %.c 
    $(CC) $(CFLAGS) [email protected] $< 
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 

我到底做錯了什麼?

回答

2

這裏:

$(TASKS): $(TASK_OBJECTS) $(OBJS) 
    $(CC) -o [email protected] $(TASK_OBJECTS) $(OBJS) 

你構建每個可執行從所有對象。相反,你應該使用靜態模式規則(如一個你已經使用$(TASK_OBJECTS)):

$(TASKS): % : %.o $(OBJS) 
    $(CC) -o [email protected] $^ 

(注:$^是「所有先決條件」的自動變量。)

+0

哦,它的作品! =)經過數小時的試用後,終於可以正常工作了,非常感謝,這個答案是閱讀/搜索/試用makefiles的重要資料來源,再次感謝! – Ikakok 2013-03-20 12:45:16

+0

還有一件事要說清楚,它看起來像 對象來源:要採取的單詞:搜索前一個+「。o」的單詞並在命令行中使用result-prerequisit(它會調用它,對吧? ) – Ikakok 2013-03-20 12:50:34

+0

@Ikakok:是的,這是正確的。 – Beta 2013-03-20 12:54:20

相關問題