今天我一直在抨擊這個問題。編譯一個包含多個目錄的文件列表
我在許多目錄中有許多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的人都可以幫忙嗎?
但後來沒有爲對象 沒有規則'做:***沒有規則可以讓'all'所需的目標'obj/src/thing1/thing1.o'。 Stop.' – regomodo
@regomodo對不起,錯過了你的objs進入另一個目錄的事實。 – CrazyCasta
謝謝,這取代了我的很多規則。 – regomodo