Makefile的一種通用寫法

2021-07-09 06:41:10 字數 1764 閱讀 8984

管理linux環境下的c/c++大型專案,如果有乙個智慧型的build system會起到事半功倍的效果,本文描述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的寫法就可以完全掌握了。

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

管理linux環境下的c c 大型專案,本文描述linux環境下大型工程專案子目錄makefile的一種通用寫法,使用該方法,當該子目錄內的檔案有增刪時無需對makefile進行改動,可以說相當的智慧型。下面先貼 為減小篇幅,一些非關鍵的 被去掉,本方法的侷限是用於乙個c檔案生成乙個可執行檔案的場合...

通用的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...