1. 程式人生 > >萬能makefile的剖析與示例第三彈

萬能makefile的剖析與示例第三彈

1. 本示例演示的是需連結動態庫靜態庫,且需先編譯庫的makefile的編寫方式(自己寫的簡單動態庫編譯和使用,自己寫的簡單靜態庫的編譯和使用)

2. 目的是幫助那些新接觸makefile的新手如何快速寫出可用的makefile,下載本例後完全可以稍作修改就可以滿足自己的需要

3. 本篇部落格逐條語句分析了萬能makefile的實現,儘可能多的添加了註釋,也在一些地方進行了修改,以用於不同情況下makefile的編寫

5. 如有任何疑問,可聯絡本人QQ:279533105,新增時請註明來自CSDN

以下是makefile的內容(僅貼出主makefile的程式碼),如發現錯誤,歡迎拍磚

#用於定義本專案中各個工程(庫工程,可執行程式工程)的Makefile所在路徑以及它們之間的依賴關係

# 專案根目錄,下面" PROJECT_ROOT := .. "的意思是專案的根目錄在本目錄的上一級目錄
PROJECT_ROOT := ..

# 習慣:LIB開頭的為庫檔案工程所在的目錄,BIN開頭的為可執行程式工程所在的目錄
LIB_DYNAMIC_LIB                        	:= $(PROJECT_ROOT)/dynamic_lib			# 備註:本專案中的動態庫示例工程所在目錄,名字隨意
LIB_STATIC_LIB                         	:= $(PROJECT_ROOT)/static_lib			# 備註:本專案中的靜態庫示例工程所在目錄,名字隨意
BIN_EXAMPLE_EXE                        	:= $(PROJECT_ROOT)/use_lib_example		# 備註:本專案中使用動態庫,靜態庫的示例程式工程所在目錄,名字隨意

# 執行 make clean時偽目標中用到的名字集合(即庫工程,可執行程式工程所在路徑的名字)
# 注意後面都加了"_CLEAN" ,目的是為了不與其他偽目標名字重複,對應每個庫所在的路徑,每個可執行程式所在的路徑
# 具體值仍為路徑,當執行該偽目標時,需要先跳轉到該目錄,再執行 make clean 命令
LIB_DYNAMIC_LIB_CLEAN			:= $(LIB_DYNAMIC_LIB)
LIB_STATIC_LIB_CLEAN			:= $(LIB_STATIC_LIB)
BIN_EXAMPLE_EXE_CLEAN               := $(BIN_EXAMPLE_EXE)

# 執行 make veryclean時偽目標中用到的名字集合(即庫檔案,可執行程式所在的路徑的名字)
# 注意後面都加了"_VERYCLEAN" ,目的是為了不與其他偽目標名字重複,對應每個庫所在的路徑,每個可執行程式所在的路徑
# 具體值仍為路徑,當執行該偽目標時,需要先跳轉到該目錄,再執行 make veryclean 命令
LIB_DYNAMIC_LIB_VERYCLEAN              	:= $(LIB_DYNAMIC_LIB)
LIB_STATIC_LIB_VERYCLEAN              	:= $(LIB_STATIC_LIB)
BIN_EXAMPLE_EXE_VERYCLEAN              	:= $(BIN_EXAMPLE_EXE)

# 所有的各個工程(庫工程,可執行程式工程)所在路徑的名字
# 注意:PROJECT_NAMES是下面偽目標的名字,最終是要執行的
PROJECT_NAMES := LIB_DYNAMIC_LIB \
		LIB_STATIC_LIB  \
			BIN_EXAMPLE_EXE

# clean時的所有工程所在路徑的名字集合
# 函式 addsuffix	_加字尾函式,示例:$(addsuffix .c,foo bar)返回值是foo.c bar.c
# 由上面的 PROJECT_NAMES 定義,
# 注意: PROJECT_NAMES_CLEAN是下面偽目標的名字,最終是要執行的
PROJECT_NAMES_CLEAN 	:= $(addsuffix _CLEAN, $(PROJECT_NAMES))

# veryclean時的所有工程所在路徑的名字集合
PROJECT_NAMES_VERYCLEAN := $(addsuffix _VERYCLEAN, $(PROJECT_NAMES))

# 所有的偽目標,.PHONY用來宣告所有的偽目標
# 當執行make all 時,由於偽目標all依賴於$(PROJECT_NAMES),所以會先執行偽目標$(PROJECT_NAMES),即執行其命令 $(MAKE) -C $(
[email protected]
),也就是進入到每個目錄去執行make .PHONY: all $(PROJECT_NAMES) clean $(PROJECT_NAMES_CLEAN) veryclean $(PROJECT_NAMES_VERYCLEAN) all : $(PROJECT_NAMES) clean : $(PROJECT_NAMES_CLEAN) veryclean : $(PROJECT_NAMES_VERYCLEAN) # 切換到指定的目錄,再執行make操作,-C表示進入後面的目錄,$([email protected])表目前規則中所有目標的集合 # 以 LIB_DYNAMIC_LIB 為例,已知上面定義LIB_DYNAMIC_LIB := $(PROJECT_ROOT)/dynamic_lib # 執行時下面的命令顯示為: # 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 $(
[email protected]
) # 切換到指定的目錄,再執行make clean操作 $(PROJECT_NAMES_CLEAN) : $(MAKE) -C $([email protected]) clean # 切換到指定的目錄,再執行make veryclean操作 $(PROJECT_NAMES_VERYCLEAN) : $(MAKE) -C $([email protected]) veryclean # 所有的工程名字(目標名字)的依賴關係,也是使用偽目標的依賴來實現的 # 以下面一行的 BIN_EXAMPLE_EXE 為例,表示 BIN_EXAMPLE_EXE 依賴於LIB_DYNAMIC_LIB和LIB_STATIC_LIB # 要生成目標BIN_EXAMPLE_EXE ,必須先生成後面的目標 LIB_DYNAMIC_LIB 和 LIB_STATIC_LIB # 這樣的話,當生成 BIN_EXAMPLE_EXE的時候,如果其依賴項還未生成,則會先去執行生成依賴項的命令 BIN_EXAMPLE_EXE : LIB_DYNAMIC_LIB LIB_STATIC_LIB


相關推薦

萬能makefile剖析示例

1. 本示例演示的是需連結動態庫靜態庫,且需先編譯庫的makefile的編寫方式(自己寫的簡單動態庫編譯和使用,自己寫的簡單靜態庫的編譯和使用)2. 目的是幫助那些新接觸makefile的新手如何快速寫出可用的makefile,下載本例後完全可以稍作修改就可以滿足自己的需要3

設計實現分離——面向接口編程(OO博客

none @override flag ava 三種 time rri 初學 fault 如果說繼承是面向對象程序設計中承前啟後的特質,那麽接口就是海納百川的體現了。它們都是對數據和行為的抽象,都是對性質和關系的概括。只不過前者是縱向角度,而後者是橫向角度罷了

python學習之路—— (作業篇第一題)

image 操作 啟動程序 代碼 color 鎖定文件 文件 文件內容 數據 作業一:編寫登錄接口1.輸入用戶名密碼2.認證成功後顯示歡迎信息3.輸錯三次後鎖定。 所需知識點 文件基本讀寫操作,循環,列表,字典 上面的作業題是在學習完數據類型和簡單的文件操作之後布置的,

Python進階---面向對象(進階篇)

python對象 one iss pri each super left connect ext  Python對象中一些方法 一、__str__ class Teacher: def __init__(self,name,age): self.name

加密解密章:IDA的基本操作

substr line for src 用法 標準庫 set poi 調用 更改數據為結構體和枚舉類型 查看輸入和輸出的idc腳本 //Imports.idc ?г??????????????? //(c) www.PEDIY.com 2000-2008 #includ

lavarel從零開始-(路由,控制器,視圖)

clas space web 傳參 route where ace enter ber routes/web.php寫路由 基本路由: Route::get(‘/‘, function () { return view(‘welcome‘);});Route::get

java面試寶典

返回 管理 過程 網絡 臨界資源 hashtable 私有化 針對 刪除 Http和Https的區別 超文本傳輸協議HTTP協議被用於在Web瀏覽器和網站服務器之間傳遞信息,HTTP協議以明文方式發送內容,不提供任何方式的數據加密,如果攻擊者截取了Web瀏覽器和網站服務器之

shell指令碼學習-變數的使用

shell指令碼學習第三彈-變數的使用 一、什麼是變數 相信大家聽到變數這個詞語很敏感吧,我們的C語言中也有所謂的變數,變數即在程式執行過程中它的值是允許改變的量。 也可以這麼說,變數的本質是一種鍵值對,舉個例子來說:str=“123456”,“12345”就是鍵值對中的Val

noip 迴圈語句

迴圈語句包括for迴圈和while迴圈。其中兩個可以互相轉換。 while迴圈 最簡單的while(1)即為無限迴圈 #include <iostream> using namespace std; int main(){ while(1){//其中在計算機中 1 即

JS自學

(1)JS的資料型別(7種):數值、字串、陣列、布林、物件、Null、undefined ​ <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>JS資料型別

E - Largest Submatrix of All 1’s POJ - 3494 -單調棧-

E - Largest Submatrix of All 1’s  POJ - 3494  題目大意:找一個全部是1的最大子矩陣 解題思路:https://blog.csdn.net/zuzhiang/article/details/78136417

neo4j圖形資料庫——整合springboot(支援查詢多節點)

正經學徒,佛系記錄,不搞事情 官網結合java的使用方式:https://neo4j.com/developer/java/ 這裡使用springboot 第一步:引入pom <dependency> <groupId>org.neo4j.driv

高併發:執行緒安全-原子性

執行緒安全性? 執行緒安全性主要體現在三個方面:原子性、可見性、有序性 原子性:提供了互斥訪問,同一時刻只能有一個執行緒來對它進行操作 可見性:一個執行緒對主記憶體的修改可以及時的被其他執行緒觀察到 有序性:一個執行緒觀察其他執行緒中的指令執行順序,由於指令重排序的存在,該觀察結果一般雜亂無序。 本章主

Mybatis學習

今天正好學到#{}和${}取值,想到之前面試的時候面試官問 Mybatis 裡面的佔位符是什麼,自己傻傻地說了一個 % ,希望你看完以後不要再犯跟我一樣的錯誤了 1、#{} 是Mybatia 中的佔位符,它是以預編譯(PrepareStatement)的形式,將引數用特定值

演算法設計分析次作業

#leetcode 685.Redundant Connection II In this problem, a rooted tree is a directed graph such that, there is exactly one node (the

【題解】洛谷P4902[CYJian的水題大賽[]]C.乘積 線性篩

題目連結 賽後題解 講道理,中間那些公式變形看明白了,線性篩那段給我搞蒙了……h是算啥的,為啥要%(mod-1) QAQ #include<cstdio> const int mod=19260817,N=1e6+10; int t,a,b,p

【比賽報告】CYJian的水題大賽[]

A.食堂 題目連結 賽後題解把我秀到了,中間這段變形我是怎麼也想不到的。 總結 當時做這道題寫了兩小時直接炸飛。首先就是這個取小數部分處理不來,然後就肯定GG了。 從這題能學到的:取小數部分的處理、公式變形(重點)、多次字首和求解。 B.乘積 題目

【轉】LLVM——幾維安全CTO劉柏江:IoT時代LLVM編譯器防護的藝術

      「隨著物聯網時代的開啟,需要解決的安全問題會愈來愈多,而程式碼安全是其他安全方案的底層支撐。面對晶片架構繁多,執行環境複雜的嵌入式物聯網裝置,傳統的程式碼安全方案都將會失效,LLVM編譯器為我們帶來了終極程式碼安全解決方案。」        日前,幾維安全C

老鼠屎地理資訊視覺化:Plotly+Pyecharts繪製地理座標系線圖

    由於最近老鼠屎做的東西和地圖上的線型圖相關,因此在這裡做一點簡單總結。很多地方都除錯得很不理想,希望成功的地方可以給大家帶來一點點啟發,不理想的地方也歡迎大神們賜教。 1 Plotly 1.1 地圖上繪製線     有關pyplot的相關在老鼠屎的博文使用plo

scala學習:scala實戰

需要安裝的軟體jdk scala sbt repl sbt(simple build tools)為scala而設計 scala的互動式介面叫做repl介面 進入互動介面:命令列輸入scala 退出互