Makefile的一種通用寫法以及其中的字段含義

2021-08-31 18:10:26 字數 2442 閱讀 4408

管理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...