makefile之大型專案

2021-06-19 09:52:54 字數 1820 閱讀 2609

管理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的寫法就可以完全掌握了。

注:當前目錄直接make的兩種寫法見 makefile之寫demo時的通用makefile寫法

大型專案的特點

二 高併發 三 集群 四 海量資料 將專案按照特定的規則拆分成多個子專案,分開來發布一般在大型專案中使用使用傳統專案 單個專案 開發時,如果其中乙個功能模組出現問題,可能會影響到整個專案的使用。為了解決這種問題,使用了分布式,將專案的功能模組在架構層級松耦合分布式主要有兩種拆分方式 垂直拆分和水平拆...

Linux c 大型專案的除錯技巧

巧妙利用列印資訊 直接在函式裡面呼叫void print trace 就可以找到呼叫它的函式的層級關係 printf s,s,d n file function line printf test num streams d n test num streams void print trace vo...

在大型專案中組織CSS

譯者 kayson 編寫css容易。編寫可維護的css難。這句話你之前可能聽過1 00次了。原因是css中的一切都預設為全域性的。如果你是乙個c程式設計師你就知道全域性變數不好。如果你是任何一種程式設計師,你都知道隔離和可組合的模組是構建可維護系統的關鍵。為了試圖幫助人們構建可維護的css,已經有很...