2012-09-27 83 views
0

今天我一直在抨擊這個問題。編譯一個包含多個目錄的文件列表

我在許多目錄中有許多c文件。他們都需要編譯並鏈接到一個庫。

這裏是文件的假想佈局:

main_dir/ 
    thing1/ 
    thing1.c 
    thing2/ 
    thing2.c 
    thing3/ 
    thing3.c 
MakeFile 

我有一個makefile說,「發現」這些文件並生成必要的對象,然而,相同的C文件始終用作輸入。

這是Makefile的樣子(每個文件的內容是每一個使用看跌期權()函數):

C=gcc 
CFLAGS=-Wall -g 
OBJDIR=obj 
SRC=$(shell find src/ -type f -name "*.c") 
SRC_DIRS=$(shell find src/ -type f -name "*.c" -exec dirname {} \; | uniq) 
OBJS=$(SRC:%.c=${OBJDIR}/%.o)  

$(OBJS) : $(SRC) 
    @echo Compiling : $< 
    $(C) -c $(CFLAGS) -o [email protected] $< 

clean: 
    rm -fv $(OBJS) thingy.a 

folders: 
    $(call build_dirs) 

all: folders $(OBJS) 
    ar -r -o thingy.a $(OBJS) 

define build_dirs 
    for dir in $(SRC_DIRS); do \ 
     mkdir -pv $(OBJDIR)/$$dir; \ 
    done 
endef 

作出的輸出:

for dir in src/thing1 src/thing2 src/thing3; do mkdir -pv obj/$dir; done 
Compiling : src/thing1/thing1.c 
gcc -c -Wall -g -o obj/src/thing1/thing1.o src/thing1/thing1.c 
Compiling : src/thing1/thing1.c 
gcc -c -Wall -g -o obj/src/thing2/thing2.o src/thing1/thing1.c 
Compiling : src/thing1/thing1.c 
gcc -c -Wall -g -o obj/src/thing3/thing3.o src/thing1/thing1.c 
ar -r -o thingy.a obj/src/thing1/thing1.o obj/src/thing2/thing2.o obj/src/thing3/thing3.o 
ar: creating thingy.a 

我非常確定的問題是我使用$(SRC) $(OBJS):$(SRC) 但是,我只是不知道該怎麼辦。

任何有MakeFu的人都可以幫忙嗎?

回答

1

你$(OBJS)似乎被正確安裝,所以下面應該工作(而不是$(OBJ):$(SRC)目標):

$(OBJDIR)/%.o : %.c 
    @echo Compiling : $< 
    $(C) -c $(CFLAGS) -o [email protected] $< 
+0

但後來沒有爲對象 沒有規則'做:***沒有規則可以讓'all'所需的目標'obj/src/thing1/thing1.o'。 Stop.' – regomodo

+0

@regomodo對不起,錯過了你的objs進入另一個目錄的事實。 – CrazyCasta

+0

謝謝,這取代了我的很多規則。 – regomodo

1

你說得對的$(OBJS)規則成爲問題。

看看變量:(SRC)src/thing1/thing1.c src/thing2/thing2.c src/thing3/thing3.c$(OBJS)obj/src/thing1/thing1.o obj/src/thing2/thing2.o obj/src/thing3/thing3.o。 (你確定你想在一個obj/目錄src?)現在假設你想用這個規則來構建obj/src/thing2/thing2.o

$(OBJS) : $(SRC) 
    @echo Compiling : $< 
    $(C) -c $(CFLAGS) -o [email protected] $< 

的前提場($(SRC))擴展爲「的src/thing1/thing1.c SRC /thing2/thing2.c src/thing3/thing3.c「,因此$<擴展爲」src/thing1/thing1.c「。很明顯,你想在這種情況下是「src/thing2/thing2.c」,所以這是必備條件應該是什麼。您需要的是類似pattern rulestatic pattern rule的東西。訣竅是,你不知道的路徑時間提前,並且使不處理的模式,因此我們必須要麻利:

$(OBJS) : $(OBJDIR)/%.o : %.c 
    @echo Compiling : $< 
    $(C) -c $(CFLAGS) -o [email protected] $< 
+0

感謝您的信息。我不得不從規則中刪除'$(OBJS)'來使其工作。 – regomodo

相關問題