client檔案具體解析

2021-09-28 13:27:01 字數 2877 閱讀 9600

此篇博文部分引用梁庚、陳明、馬小錄老師《高質量嵌入式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的開發者,當他需...