此篇博文部分引用梁庚、陳明、馬小錄老師《高質量嵌入式linux c程式設計》一書
在實際的開發過程中,僅僅通過使用gcc命令對程式進行編譯是非常低效的,原因為:
(1)程式往往是由多個原始檔組成的,原始檔的個數越多,那麼gcc的命令列就會越長。此外,各種的編譯規則也會加大gcc命令列的複雜度,所以在開發除錯程式的過程中,通過輸入gcc命令列來編譯程式是很麻煩的。
(2)在程式的整個開發過程中,除錯的工作量佔到整體工作量的70%以上。在除錯程式的過程中,每一次除錯一般只會修改部分原始檔。而在使用gcc命令列編譯程式時,gcc會把那些沒修改的原始檔一起編譯,這樣就會影響編譯的總體效率。
make工程管理器是完全根據makefile檔案中的編譯規則命令進行工作的。makefile檔案有以下三項基本內容組成:
目標檔案:依賴檔案
編譯規則命令列
以hello.c為例的makefile檔案:
vim makefile命令
hello : hello.c
gcc hello.o -o hello
hello.o:hello.c
gcc -c hello.c
make工程管理器在編譯程式時會檢查每個依賴檔案的時間戳,一旦發現某個依賴檔案的時間戳比目標檔案要新,就會執行目標檔案的規則命令來重新生成目標檔案。(自動根據makefile規則編譯、自動檢查時間戳)
為什麼要先變成.o檔案
加快編譯速度(只把變化的.c生成.o,省時間、其他不變的直接鏈結)
同時有個偽目標:(還以hello為例)用於hello資料夾中刪除.o檔案
.phony : clean
clean:
rm -f *.o hello
下面以client檔案做具體解析:
tree 型圖
由此我們可以看出makefile檔案有三類:
總控makefile:1、進入各個子目錄(功能子目錄)裡執行make 命令
2、將所有的.o檔案鏈結生成最終可執行檔案
功能子目錄makefile:將src目錄下的.c檔案編譯生成.o檔案
scripts目錄的makefile:定義許多變數(相當於c語言中的標頭檔案)
由這三類makefile的功能可以看出:要想看懂程式,先看scripts目錄的makefile 然後總控makefile 最後功能子目錄makefile
同時開發程式要學會給各個功能實現的**等等分類,如:每個功能下有src (原始碼) png() doc(文件) lib(庫) bin(可執行檔案) include(標頭檔案)scripts(指令碼檔案)等。
三類makefile都有各自的模板,依舊以client中的makefile檔案為例
scripts目錄的makefile
cc := gcc
cflags := -wall -o3
libs = -lpthread #加入庫函式pthread
target := client
source := $(wildcard src/*.c) #列出所有src目錄下的所有.c檔案
objs := $(patsubst %.c,%.o,$(source)) #將列出的.c檔案變成.o檔案
modules += check_putin pack_message main #將所有資料夾相加同時賦給了modules這個變數
allobjs := $(addsuffix /src/*.o,$(modules)) #將modules資料夾下的src下的.o檔案賦給allobjs
總控makefile:
include scripts/makefile
modules_make = $(make) -c $(1); #讀取總控makefile,然後去讀取各個目錄下的子makefile檔案
modules_clean = $(make) clean -c $(1);
phony: all mm mc clean
all: $(target)
mm:@ $(foreach n,$(modules),$(call modules_make,$(n)))
#將modules中的值賦給n,執行將n賦給modules_make,即對每個資料夾下執行make
mc:@ $(foreach n,$(modules),$(call modules_clean,$(n)))
$(target) : mm
$(cc) $(cflags) -o $(target) $(allobjs) $(libs)#編譯所有.c檔案到.o檔案
@ echo $(target) make done!#編譯時執行卻不顯示,列印client make done
clean : mc
rm -rf $(target)
@ echo clean done!
功能子目錄makefile(子目錄中makefile內容一樣):
include ../scripts/makefile
all : $(objs) #編譯所有.c檔案到.o檔案
clean :
rm -rf $(objs)
makefile特性:變數 自動推導 檔案查詢 巢狀執行 條件判斷 函式
(需自主查閱資料 另每個函式都要知道其功能!)
mapreduce具體解析
1.mapreduce作業執行流程 下面貼出我用visio2010畫出的流程示意圖 流程分析 1.在客戶端啟動乙個作業。2.向jobtracker請求乙個job id。3.將執行作業所需要的資源檔案複製到hdfs上,包括mapreduce程式打包的jar檔案 配置檔案和客戶端計算所得的輸入劃分資訊。...
HTTP協議 具體解析
之前介紹過http的基礎知識,這章來繼續 一下具體組成。為之後自己寫web伺服器打個基礎。超文字傳輸協議,具體的看我之前的部落格 http協議。http通常是作為應用層的協議。http協議承載於tcp協議之上,有時候也承載在tls ssl協議層之上 https 回顧一下工作流程 客戶端連線到web伺...
全面解析C 建立XML檔案的具體操作
隨著xml的普及以及在動態web應用程式中大量應用,如何通過.netc 建立,刪除,修改xml檔案變的也來也重要了。那麼如何c 建立xml檔案呢?具體的操作又是如何呢?讓我們開始具體的講解 乙個簡單的概念是,xml檔案跟大的文字檔案並沒有什麼區別,同時它是先於.net出現,很多asp的開發者,當他需...