萬能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 退出互