管理linux環境下的c/c++大型專案,本文描述linux環境下大型工程專案子目錄makefile的一種通用寫法,使用該方法,當該子目錄內的檔案有增刪時無需對makefile進行改動,可以說相當的智慧型。
下面先貼**(為減小篇幅,一些非關鍵的**被去掉,本方法的侷限是用於乙個c檔案生成乙個可執行檔案的場合):
rootdir = .
exe_dir = ./bin
cflags = -i$(include_dir) -i$(lib_inc) -wall
lflags = -l$(lib_dir)
objects := $(patsubst %.c,%.o,$(wildcard *.c))
executables := $(patsubst %.c,%,$(wildcard *.c))
all : $(objects)
$(objects) :%.o : %.c
@mkdir -p ./bin$
$(cross_compile)gcc -c $(cflags) $< -o $@
$(cross_compile)gcc $(cflags) $< -o $(subst .o, ,$(exe_dir)/$@) $(lflags) $(libs)
clean:
@rm -f *.o rm -f $(executables)
@rm -rf ./bin
distclean: clean
假如當前目錄裡面有a.c b.c兩個檔案
makefile 裡的函式跟它的變數很相似——使用的時候,你用乙個$符號跟左圓括號,函式名,空格後跟一列由逗號分隔的引數,最後用右圓括號結束。例如,在gnu make裡有乙個叫'wildcard' 的函式,它有乙個引數,功能是展開成一列所有符合由其引數描述的檔名,檔案間以空格間隔。像這個命令:
objects= $(wildcard *.c)
會產生乙個所有以'.c' 結尾的檔案列表(本例結果為a.c b.c),然後存入變數objects裡。
另乙個有用的函式是 patsubst ( patten substitude,匹配替換的縮寫)函式。它需要3個引數——第乙個是乙個需要匹配的式樣,第二個表示用什麼來替換它,第三個是乙個需要處理由空格分隔的序列。我們將兩個函式合起來用:
objects := $(patsubst %.c,%.o,$(wildcard *.c))
會被處理為:
objects := a.o b.o
同理:
executables := $(patsubst %.c,%,$(wildcard *.c))
會被處理為:
executables := a b
%.o:所有以「.o」結尾的目標,也就是a.o b.o
依賴模式「%.c」:取模式「%.o」的%,也就是foo bar,並為其加上.c字尾,即a.c,b.c
$<:表示所有依賴目標集,也就是a.c b.c
$@:表示目標集,也就是a.o b.o
命令前加@,表示在終端中不列印,如@mkdir -p ./bin
$(objects) : %.o: %.c
$(cross_compile)gcc -c $(cflags) $< -o $@
即可翻譯為:
a.o b.o : a.c b.c $(cross_compile)gcc -c $(cflags) (a.c b.c) -o (a.o b.o)
明白了這些,這種makefile的寫法就可以完全掌握了。
注:當前目錄直接make的兩種寫法:
1:如果在當前目錄中直接make的話使用下列**:
#general purpose makefile by guoqingbo
objects := $(patsubst %.c,%.o,$(wildcard *.c))
executables := $(patsubst %.c,%,$(wildcard *.c))
all : $(objects)
$(objects) : %.o: %.c
gcc -c $< -o $@
gcc $< -o $(subst .o, ,$@)
clean :
@rm -rf *.o *~
@rm -rf $
.phony : clean
2:後來發現下列**也可以有相同效果,難道使用了什麼預設規則,還不是很明白,先記錄下來:
#general purpose makefile by guoqingbo
executables := $(patsubst %.c,%,$(wildcard *.c))
all : $(executables)
clean :
@rm -rf *.o *~
@rm -rf $
.phony : clean
Makefile的一種通用寫法
管理linux環境下的c c 大型專案,如果有乙個智慧型的build system會起到事半功倍的效果,本文描述linux環境下大型工程專案子目錄makefile的一種通用寫法,使用該方法,當該子目錄內的檔案有增刪時無需對makefile進行改動,可以說相當的智慧型。下面先貼 為減小篇幅,一些非關鍵...
通用的makefile寫法
1 定義可執行檔案的名稱 target mypro 2 指定此編譯工程所要使用的標頭檔案所在的目錄 inc i.iheader1 iheader2 3 指定cpp檔案所在的目錄 vpath src1 src2 4 指定所有的cpp檔案 src path foreachdir,subst vpath ...
weakself的一種寫法
前言在不久前看afnetworking的原始碼時候發現了這麼一句 不知道這行 的使用場景的同學你該去自習看看arc的注意事項和block的使用了 afnetworking的寫法 weak typeof self weakself self 我之前一直這麼寫的 weak typeof self wea...