管理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,已經有很...