万能makefile深入浅出 - 第三篇
1. 本示例演示的是需鏈接動(dòng)態(tài)庫(kù)靜態(tài)庫(kù),且需先編譯庫(kù)的makefile的編寫方式(自己寫的簡(jiǎn)單動(dòng)態(tài)庫(kù)編譯和使用,自己寫的簡(jiǎn)單靜態(tài)庫(kù)的編譯和使用)
2. 目的是幫助那些新接觸makefile的新手如何快速寫出可用的makefile,下載本例后完全可以稍作修改就可以滿足自己的需要
3.?本篇博客逐條語(yǔ)句分析了萬(wàn)能makefile的實(shí)現(xiàn),盡可能多的添加了注釋,也在一些地方進(jìn)行了修改,以用于不同情況下makefile的編寫
4. 所有示例都在centos上親測(cè)編譯,運(yùn)行通過(guò)的,附上完整示例下載鏈接:https://download.csdn.net/download/yzf279533105/10992222,下載解壓后,根目錄中有介紹文檔,請(qǐng)務(wù)必按照里面的步驟操作,保證可以運(yùn)行成功
5. 如有任何疑問(wèn),可聯(lián)系本人QQ:279533105,添加時(shí)請(qǐng)注明來(lái)自CSDN
以下是makefile的內(nèi)容(空間有限,這里僅貼出主makefile的代碼),如發(fā)現(xiàn)錯(cuò)誤,歡迎拍磚
?
#用于定義本項(xiàng)目中各個(gè)工程(庫(kù)工程,可執(zhí)行程序工程)的Makefile所在路徑以及它們之間的依賴關(guān)系# 項(xiàng)目根目錄,下面" PROJECT_ROOT := .. "的意思是項(xiàng)目的根目錄在本目錄的上一級(jí)目錄 PROJECT_ROOT := ..# 習(xí)慣:LIB開頭的為庫(kù)文件工程所在的目錄,BIN開頭的為可執(zhí)行程序工程所在的目錄 LIB_DYNAMIC_LIB := $(PROJECT_ROOT)/dynamic_lib # 備注:本項(xiàng)目中的動(dòng)態(tài)庫(kù)示例工程所在目錄,名字隨意 LIB_STATIC_LIB := $(PROJECT_ROOT)/static_lib # 備注:本項(xiàng)目中的靜態(tài)庫(kù)示例工程所在目錄,名字隨意 BIN_EXAMPLE_EXE := $(PROJECT_ROOT)/use_lib_example # 備注:本項(xiàng)目中使用動(dòng)態(tài)庫(kù),靜態(tài)庫(kù)的示例程序工程所在目錄,名字隨意# 執(zhí)行 make clean時(shí)偽目標(biāo)中用到的名字集合(即庫(kù)工程,可執(zhí)行程序工程所在路徑的名字) # 注意后面都加了"_CLEAN" ,目的是為了不與其他偽目標(biāo)名字重復(fù),對(duì)應(yīng)每個(gè)庫(kù)所在的路徑,每個(gè)可執(zhí)行程序所在的路徑 # 具體值仍為路徑,當(dāng)執(zhí)行該偽目標(biāo)時(shí),需要先跳轉(zhuǎn)到該目錄,再執(zhí)行 make clean 命令 LIB_DYNAMIC_LIB_CLEAN := $(LIB_DYNAMIC_LIB) LIB_STATIC_LIB_CLEAN := $(LIB_STATIC_LIB) BIN_EXAMPLE_EXE_CLEAN := $(BIN_EXAMPLE_EXE)# 執(zhí)行 make veryclean時(shí)偽目標(biāo)中用到的名字集合(即庫(kù)文件,可執(zhí)行程序所在的路徑的名字) # 注意后面都加了"_VERYCLEAN" ,目的是為了不與其他偽目標(biāo)名字重復(fù),對(duì)應(yīng)每個(gè)庫(kù)所在的路徑,每個(gè)可執(zhí)行程序所在的路徑 # 具體值仍為路徑,當(dāng)執(zhí)行該偽目標(biāo)時(shí),需要先跳轉(zhuǎn)到該目錄,再執(zhí)行 make veryclean 命令 LIB_DYNAMIC_LIB_VERYCLEAN := $(LIB_DYNAMIC_LIB) LIB_STATIC_LIB_VERYCLEAN := $(LIB_STATIC_LIB) BIN_EXAMPLE_EXE_VERYCLEAN := $(BIN_EXAMPLE_EXE)# 所有的各個(gè)工程(庫(kù)工程,可執(zhí)行程序工程)所在路徑的名字 # 注意:PROJECT_NAMES是下面?zhèn)文繕?biāo)的名字,最終是要執(zhí)行的 PROJECT_NAMES := LIB_DYNAMIC_LIB \LIB_STATIC_LIB \BIN_EXAMPLE_EXE# clean時(shí)的所有工程所在路徑的名字集合 # 函數(shù) addsuffix _加后綴函數(shù),示例:$(addsuffix .c,foo bar)返回值是foo.c bar.c # 由上面的 PROJECT_NAMES 定義, # 注意: PROJECT_NAMES_CLEAN是下面?zhèn)文繕?biāo)的名字,最終是要執(zhí)行的 PROJECT_NAMES_CLEAN := $(addsuffix _CLEAN, $(PROJECT_NAMES))# veryclean時(shí)的所有工程所在路徑的名字集合 PROJECT_NAMES_VERYCLEAN := $(addsuffix _VERYCLEAN, $(PROJECT_NAMES))# 所有的偽目標(biāo),.PHONY用來(lái)聲明所有的偽目標(biāo) # 當(dāng)執(zhí)行make all 時(shí),由于偽目標(biāo)all依賴于$(PROJECT_NAMES),所以會(huì)先執(zhí)行偽目標(biāo)$(PROJECT_NAMES),即執(zhí)行其命令 $(MAKE) -C $($@),也就是進(jìn)入到每個(gè)目錄去執(zhí)行make .PHONY: all $(PROJECT_NAMES) clean $(PROJECT_NAMES_CLEAN) veryclean $(PROJECT_NAMES_VERYCLEAN) all : $(PROJECT_NAMES) clean : $(PROJECT_NAMES_CLEAN) veryclean : $(PROJECT_NAMES_VERYCLEAN) # 切換到指定的目錄,再執(zhí)行make操作,-C表示進(jìn)入后面的目錄,$($@)表目前規(guī)則中所有目標(biāo)的集合 # 以 LIB_DYNAMIC_LIB 為例,已知上面定義LIB_DYNAMIC_LIB := $(PROJECT_ROOT)/dynamic_lib # 執(zhí)行時(shí)下面的命令顯示為: # make -C ../dynamic_lib # make[1]: Entering directory `/home/make_test/make3/dynamic_lib' # make[1]: Leaving directory `/home/make_test/make3/dynamic_lib'$(PROJECT_NAMES) :$(MAKE) -C $($@)# 切換到指定的目錄,再執(zhí)行make clean操作 $(PROJECT_NAMES_CLEAN) :$(MAKE) -C $($@) clean# 切換到指定的目錄,再執(zhí)行make veryclean操作 $(PROJECT_NAMES_VERYCLEAN) :$(MAKE) -C $($@) veryclean# 所有的工程名字(目標(biāo)名字)的依賴關(guān)系,也是使用偽目標(biāo)的依賴來(lái)實(shí)現(xiàn)的 # 以下面一行的 BIN_EXAMPLE_EXE 為例,表示 BIN_EXAMPLE_EXE 依賴于LIB_DYNAMIC_LIB和LIB_STATIC_LIB # 要生成目標(biāo)BIN_EXAMPLE_EXE ,必須先生成后面的目標(biāo) LIB_DYNAMIC_LIB 和 LIB_STATIC_LIB # 這樣的話,當(dāng)生成 BIN_EXAMPLE_EXE的時(shí)候,如果其依賴項(xiàng)還未生成,則會(huì)先去執(zhí)行生成依賴項(xiàng)的命令 BIN_EXAMPLE_EXE : LIB_DYNAMIC_LIB LIB_STATIC_LIB?
?
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的万能makefile深入浅出 - 第三篇的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C/C++ 时间相关用法
- 下一篇: jsoncpp判断Value中是否含有指