2013-04-08 181 views
2

這裏是我的生成文件,我在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 [email protected] $< 

obj/%.o: %.c 
    $(CC) $(CFLAGS) [email protected] $< 

$(DIRS): 
    mkdir -p [email protected] 

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 

回答

2

在此規則中:

$(NAMES): $(OBJECTS) 
    $(CC) -o [email protected] $< 

每個可執行取決於全部物體。而且由於$<僅抓取第一個先決條件,所有您看到的是obj/task1.o

這樣來做:

bin/%: obj/%.o 
    $(CC) -o [email protected] $< 

或者這樣說:

$(NAMES): bin/% : obj/%.o 
    $(CC) -o [email protected] $< 
+0

您好,感謝您的答覆,但任何的不正常工作,在第一種方式,我得到: 巨量諸如「(.init + 0x0)之類的行:_init'的多重定義 /usr/lib/i386-linux-gnu/gcc/i686-linux-gnu/4.5.2/../../../ crti.o :(.init + 0x0):首先在這裏定義「 和第二: 「gcc -o bin/task1 gcc:沒有輸入文件」 – Ikakok 2013-04-09 06:44:14

+0

@Ikakok:對不起,我犯了一個錯誤。我會編輯我的答案。 – Beta 2013-04-09 14:49:08

+0

你好再次=)現在一切正常,非常感謝,如果你發現你幫助第二次=),但如果你不介意,你可以解釋我怎麼不寫「$(NAMES):obj /% .o「(實際上我可以,但它給了我」沒有規則blahblahblah「)$(NAMES)由bin/組成,爲什麼我應該直接寫它? bin /%,是否有任何方法將符號「%」寫入$(NAMES)?也許像$(%NAMES)這樣的東西,或者給我一個鏈接(請指出,除了GNU makefile手冊之外的任何鏈接(我的英語還不夠好,無法在沒有詞彙的情況下自由閱讀) – Ikakok 2013-04-10 06:47:26

相關問題