万能makefile深入浅出 - 第四篇
1. 本示例演示的是編譯多個可執(zhí)行程序,庫文件,需鏈接動態(tài)庫靜態(tài)庫,且需先編譯庫,并且?guī)炫c庫之間,可執(zhí)行程序之間皆存在依賴關系的makefile的編寫方式(自己寫的簡單動態(tài)庫編譯和使用,自己寫的簡單靜態(tài)庫的編譯和使用)
2. 目的是幫助那些新接觸makefile的新手如何快速寫出可用的makefile,下載本例后完全可以稍作修改就可以滿足自己的需要
3.?本篇博客逐條語句分析了萬能makefile的實現(xiàn),盡可能多的添加了注釋,也在一些地方進行了修改,以用于不同情況下makefile的編寫
4. 所有示例都在centos上親測編譯,運行通過的,附上完整示例下載鏈接:https://download.csdn.net/download/yzf279533105/11000039,下載解壓后,根目錄中有介紹文檔,請務必按照里面的步驟操作,保證可以運行成功
5. 如有任何疑問,可聯(lián)系本人QQ:279533105,添加時請注明來自CSDN
以下是makefile的內(nèi)容(僅貼出主makefile的代碼),如發(fā)現(xiàn)錯誤,歡迎拍磚
#用于定義本項目中各個工程(庫工程,可執(zhí)行程序工程)的Makefile所在路徑以及它們之間的依賴關系# 項目根目錄,下面" PROJECT_ROOT := .. "的意思是項目的根目錄在本目錄的上一級目錄 PROJECT_ROOT := ..# 習慣:LIB開頭的為庫文件工程所在的目錄,BIN開頭的為可執(zhí)行程序工程所在的目錄 LIB_DYNAMIC_LIB := $(PROJECT_ROOT)/dynamic_lib # 備注:本項目中的動態(tài)庫示例工程所在目錄,名字隨意 LIB_STATIC_LIB := $(PROJECT_ROOT)/static_lib # 備注:本項目中的靜態(tài)庫示例工程所在目錄,名字隨意 BIN_EXAMPLE_EXE1 := $(PROJECT_ROOT)/use_lib_example1 # 備注:本項目中使用動態(tài)庫,靜態(tài)庫的示例程序工程1所在目錄,名字隨意 BIN_EXAMPLE_EXE2 := $(PROJECT_ROOT)/use_lib_example2 # 備注:本項目中使用動態(tài)庫,靜態(tài)庫的示例程序工程2所在目錄,名字隨意# 執(zhí)行 make clean時偽目標中用到的名字集合(即庫工程,可執(zhí)行程序工程所在路徑的名字) # 注意后面都加了"_CLEAN" ,目的是為了不與其他偽目標名字重復,對應每個庫所在的路徑,每個可執(zhí)行程序所在的路徑 # 具體值仍為路徑,當執(zhí)行該偽目標時,需要先跳轉到該目錄,再執(zhí)行 make clean 命令 LIB_DYNAMIC_LIB_CLEAN := $(LIB_DYNAMIC_LIB) LIB_STATIC_LIB_CLEAN := $(LIB_STATIC_LIB) BIN_EXAMPLE_EXE2_CLEAN := $(BIN_EXAMPLE_EXE1) BIN_EXAMPLE_EXE2_CLEAN := $(BIN_EXAMPLE_EXE2)# 執(zhí)行 make veryclean時偽目標中用到的名字集合(即庫文件,可執(zhí)行程序所在的路徑的名字) # 注意后面都加了"_VERYCLEAN" ,目的是為了不與其他偽目標名字重復,對應每個庫所在的路徑,每個可執(zhí)行程序所在的路徑 # 具體值仍為路徑,當執(zhí)行該偽目標時,需要先跳轉到該目錄,再執(zhí)行 make veryclean 命令 LIB_DYNAMIC_LIB_VERYCLEAN := $(LIB_DYNAMIC_LIB) LIB_STATIC_LIB_VERYCLEAN := $(LIB_STATIC_LIB) BIN_EXAMPLE_EXE1_VERYCLEAN := $(BIN_EXAMPLE_EXE1) BIN_EXAMPLE_EXE2_VERYCLEAN := $(BIN_EXAMPLE_EXE2)# 所有的各個工程(庫工程,可執(zhí)行程序工程)所在路徑的名字 # 注意:PROJECT_NAMES是下面?zhèn)文繕说拿?#xff0c;最終是要執(zhí)行的 PROJECT_NAMES := LIB_DYNAMIC_LIB \LIB_STATIC_LIB \BIN_EXAMPLE_EXE1 \BIN_EXAMPLE_EXE2# clean時的所有工程所在路徑的名字集合 # 函數(shù) addsuffix _加后綴函數(shù),示例:$(addsuffix .c,foo bar)返回值是foo.c bar.c # 由上面的 PROJECT_NAMES 定義, # 注意: PROJECT_NAMES_CLEAN是下面?zhèn)文繕说拿?#xff0c;最終是要執(zhí)行的 PROJECT_NAMES_CLEAN := $(addsuffix _CLEAN, $(PROJECT_NAMES))# veryclean時的所有工程所在路徑的名字集合 PROJECT_NAMES_VERYCLEAN := $(addsuffix _VERYCLEAN, $(PROJECT_NAMES))# 所有的偽目標,.PHONY用來聲明所有的偽目標 # 當執(zhí)行make all 時,由于偽目標all依賴于$(PROJECT_NAMES),所以會先執(zhí)行偽目標$(PROJECT_NAMES),即執(zhí)行其命令 $(MAKE) -C $($@),也就是進入到每個目錄去執(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表示進入后面的目錄,$($@)表目前規(guī)則中所有目標的集合 # 以 LIB_DYNAMIC_LIB 為例,已知上面定義LIB_DYNAMIC_LIB := $(PROJECT_ROOT)/dynamic_lib # 執(zhí)行時下面的命令顯示為: # 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# 所有的工程名字(目標名字)的依賴關系,也是使用偽目標的依賴來實現(xiàn)的 # 以下面一行的 BIN_EXAMPLE_EXE1 為例,表示 BIN_EXAMPLE_EXE1 依賴于LIB_DYNAMIC_LIB, LIB_STATIC_LIB, BIN_EXAMPLE_EXE2 # 要生成目標BIN_EXAMPLE_EXE1 ,必須先生成后面的目標 LIB_DYNAMIC_LIB , LIB_STATIC_LIB , BIN_EXAMPLE_EXE2 # 這樣的話,當生成BIN_EXAMPLE_EXE1的時候,如果其依賴項還未生成,則會先去執(zhí)行生成依賴項的命令 # 我們可以根據(jù)編譯時的日志看到,的確是先編譯LIB_STATIC_LIB,再編譯LIB_DYNAMIC_LIB,再編譯BIN_EXAMPLE_EXE1,最后編譯BIN_EXAMPLE_EXE2 # 其他語句同理 LIB_DYNAMIC_LIB : LIB_STATIC_LIB BIN_EXAMPLE_EXE1 : LIB_DYNAMIC_LIB LIB_STATIC_LIB BIN_EXAMPLE_EXE2 BIN_EXAMPLE_EXE2 : LIB_DYNAMIC_LIB LIB_STATIC_LIB---------------------?
請看下圖:這是編譯時的日志,先靜態(tài)庫,然后動態(tài)庫,然后BIN_EXAMPLE_EXE2,最后BIN_EXAMPLE_EXE1。說明我們指定的依賴關系確實起效了
作者:YZF_Kevin?
來源:CSDN?
原文:https://blog.csdn.net/yzf279533105/article/details/88062037
版權聲明:本文為博主原創(chuàng)文章,轉載請附上博文鏈接!
?
待續(xù)
總結
以上是生活随笔為你收集整理的万能makefile深入浅出 - 第四篇的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 经典谷歌面试题-扔鸡蛋问题
- 下一篇: Kafka史上最详细总结