1. 程式人生 > >makefile學習筆記2

makefile學習筆記2



1.makefile書寫規則:

規則包括兩個部分:依賴關係生成目標的方法

makefile中第一條規則中的目標將被確立為最終目標,其他的目標都是被這個目標所連帶出來的,如果第一條規則中的目標有很多個,那麼,第一個目標灰成為最終目標。

main.o:main.cmain.h

cc -g main.c//說明如何生成main.o這個檔案

上面例子說明:main.o依賴於main.c main.h生產的目標。main.cmain.h是目標所依賴的原始檔。

檔案的依賴關係發生條件1.main.o檔案不存在

2.main.cmian.h檔案的日期要比main.o的檔案日期要新。

規則告訴make兩件事,檔案的依賴關係和如何成成目標檔案

=========================================================================================================================

2.在規則中使用萬用字元:

make支援三個萬用字元:*“?”[...]

擴充套件知識:

wildcard:擴充套件萬用字元萬用字元(wildcard)用來指定一組符合條件的檔名

notdir:去除路徑

patsubst:替換萬用字元

--------------------------------------------------------------------------------------------------------------------------------------------------------------

例子:

test目錄下,建立a.cb.c兩個檔案,在sud目錄下,建立sa.csb.c兩個檔案。建立一個簡單的Makefile

src = $(wildcard *.c ./sub/*.c)#將./下和./sub目錄下的所有的.c檔案,全部展開

dir = $(notdir $(src))#將./和./sub目錄下的.c檔案去掉路徑名。

obj = $(patsubst %.c,%.o,$(dir))#將./和./sub目錄下的全部.c檔案替換成.o檔案

all:

@echo "src的列印結果是:$(src)"

@echo "dir的列印結果是:$(dir)"

@echo "obj的列印結果是

:$(obj)"

@echo "××××××××列印完畢××××××××××"

列印結果:

src的列印結果是:a.cb.c ./sub/sa.c ./sub/sb.c

dir的列印結果是:a.cb.c sa.c sb.c

obj的列印結果是:a.ob.o sa.o sb.o

××××××××列印完畢××××××××××

用函式wildcard得到當前目錄下的所有c語言源程式檔名的方法 SRC=$(wildcard *.c)

如果還要要獲得子目錄sub下的檔案,則可寫成:SRC=$(wild *c) $(wildcard ./sub/*.c )

--------------------------------------------------------------------------------------------------------------------------------------------------------------------

正常情況下make會先列印每一條命令語句,然後再執行,這叫回聲。在語句前面加上"@",關閉回聲。就像上面幾句echo語句前加了@,所以沒有列印語句。

==========================================================================================================================

3.模式匹配符

Make命令允許對檔名進行類似於正則運算的匹配。主要用到的匹配符“%”。

---------------------------------------------------------------------------------------------------------------------------------------------------

例如:如果當前目錄下的有main.c foo.c兩個檔案,現在要將他們編譯為對應的物件檔案。

%.o : %.c

相當於:

main.o : main.c

foo.o : foo.c

------------------------------------------------------------------------------------------------------------------------------------------------------

使用匹配符%,可以將大量同類型的檔案,只用一條規則就完成構建

==========================================================================================================================

4.變數和賦值符

Makefile一共提供了四個賦值運算子:=:=?=+=

=:在執行時擴充套件,允許遞迴擴充套件

:=:在定義時擴充套件

?=:只有在該變數為空時才設定值

+=:將值追加到變數的尾端

Makefile允許使用等號自定義變數。在呼叫時要用 $()括起來。在呼叫shell變數時美元符號前,再加一個美元符號,這是因為Make命令會對美元符號轉義。

例如:

a= hello world
test:
	@echo $(a)
	@echo $$HOME

輸出結果:

        hello world

       /home/ubuntu

==========================================================================================================================

5.內建變數

Make命令提供一系列內建變數。$(CC)指向當前使用的編譯器,$(MAKE)指向當前使用的make工具

===========================================================================================

6.自動變數

[email protected] :指當前目標,Make命令當前構建的那個目標。

例如:

a.txt b.txt:
	touch [email protected]
                  

執行結果:

                   在當前目錄下建立了a.txt 和b.txt兩個檔案。

所以上面的相當於:

a.txt:
	touch a.txt
b.txt:
	touch b.txt

2.$< :指代第一個前置條件

例如:a: b c那麼$<指代a

3.$^:指代所有的前置條件

例如:a: b c那麼$<指代a b

4.$? :指代比目標更新的所有前置條件,之間以空格分隔.

例如:a: b c如果b的時間比a的時間新。那麼$?指代b

5.$* :指代匹配符%匹配的部分

例如:%匹配a.txt中的a,那麼$*指代a

6.$(@D)$(@F) : $(@D):指向[email protected]的目錄

$(@F):指向[email protected]的檔名

例如:[email protected]指代 test/a.c則:$(@D)指代test$(@F)指代a.c

7.$(>D)$(>F):$(>D):指向$>的目錄

$(>F):指向$>的檔名



相關推薦

makefile學習筆記2

 1.makefile書寫規則: 規則包括兩個部分:依賴關係和生成目標的方法 makefile中第一條規則中的目標將被確立為最終目標,其他的目標都是被這個目標所連帶出來的,如果第一條規則中的目標有很多個,那麼,第一個目標灰成為最終目標。 main.o:main.cma

學習筆記2

建議 coo line 長度 cape 發展 div+css 加載 不兼容 雙標簽: <html><head><title><body><table><tr><td><span>

Jmeter學習筆記2-原件作用域與執行順序

校驗 height sse proc tro 有效 收集 技術分享 控制 1.元件的作用域 (1)配置元件(config elements):會影響其作用範圍內的所有元件。 (2)前置處理程序(per-processors):在其作用範圍內的每一個sampler元件之

python學習筆記2:字符串

nbsp 大小 alpha .com format 大小寫 fin 判斷大小 key python學習筆記2:字符串 總結:字符串是不可變變量,不能通過下標修改其值    字符串的方法都不會改變字符串原來的值,而是新生成一個字符串 一、3種寫法——單引號,雙引號,三引號  

java 學習筆記2 面向對象(上)

awr ges abs nal mage 有效 面向對象 ima col 類和對象 類是某一批對象的抽象,可以把類理解成某種概念。對象是一個具體存在的實體。類和對象是面向對象的核心。 類定義的是多個實例的特征,類不是具體存在,實例才是具體存在。 定義類(class)的語法:

Git學習筆記2——Git版本庫的創建

文件添加 不但 提交 linu 記錄 例子 blog 所有 out 創建一個版本庫非常簡單,首先,選擇一個合適的地方,創建一個空目錄: $ cd s: $ cd Git_Learing $ pwd s/Git_Learning pwd命令用於顯示當前目錄。在我的wind

Hadoop 學習筆記 (2) -- 關於MapReduce

規模 pre 分析 bsp 學習筆記 reduce 數據中心 階段 圖例 1. MapReduce 定義: 是一種可用於數據處理的編程的模型 優勢: MapReduce 本質上是並行運行的,因此可以將大規模的數據分析任務,分發給任何一個擁有足夠多機器

算法導論學習筆記(2)-歸並排序

mar 今天 iostream 介紹 font 額外 遞歸 size dsm 今天學習了算法導論上的歸並排序算法,而且完畢了在紙上寫出偽代碼,曾經就學過歸並可是理解的不夠透徹。以 前還一直困惑:為什麽明明歸並排序比快排的時間復雜度更穩定。為什麽庫函數不用歸

ESP8266學習筆記2:實現ESP8266的局域網內通信

pro reg sad net nts 理解 模式 curl ont 上一篇熟悉了編譯下載操作。如今就以實例入手。project使用的是IOT_DEMO,據DEMO文檔能夠知道ESP8266初始工作模式為softAP+station共存的模式。於是這邊我們就先以soft

(MYSQL學習筆記2)多表連接查詢

mysql3種連接方式的區別:INNER JOIN(內連接,或等值連接):獲取兩個表中字段匹配關系的記錄。LEFT JOIN(左連接):獲取左表所有記錄,即使右表沒有對應匹配的記錄。RIGHT JOIN(右連接): 與 LEFT JOIN 相反,用於獲取右表所有記錄,即使左表沒有對應匹配的記錄。3個表連接查詢

JavaSE中Collection集合框架學習筆記(2)——拒絕重復內容的Set和支持隊列操作的Queue

%d eof 是否 face 出錯 can 3.2 lean als 前言:俗話說“金三銀四銅五”,不知道我要在這段時間找工作會不會很艱難。不管了,工作三年之後就當給自己放個暑假。 面試當中Collection(集合)是基礎重點.我在網上看了

Linux學習筆記2-安裝遠程連接客戶端SecureCRT

下載 linux log 學習 文件 spa 客戶端 pre 百度下載 1、百度下載SecureCRT8.0版本 2、安裝,破解 3、百度使用教程,使用SecureCRT連接Linux系統,並操作 4、安裝rzsz,(這樣就能直接把文件復制到Linux系統裏了) yum

C++學習筆記----2.4 C++對象的內存模型

影響 sni 創建 clas esp cheng lac -c 如果 轉載自:http://c.biancheng.NET/cpp/biancheng/view/2995.html點擊打開鏈接 當對象被創建時,編譯器會為每個對象分配內存空間,包括成員變量和成員函數。直觀的認

C++學習筆記----2.4 C++引用在本質上是什麽,它和指針到底有什麽區別

times 數據 添加 eof 相關 參數 副本 span 符號 從概念上講。指針從本質上講就是存放變量地址的一個變量,在邏輯上是獨立的,它可以被改變,包括其所指向的地址的改變和其指向的地址中所存放的數據的改變。 而引用是一個別名,它在邏輯上不是獨立的,它的存在具有依附性,

java學習筆記(2)

區別 ner false blog == imp 表達 知識 最大值 java基礎知識: 1:運算符 (1)算術運算符 A:+,-,*,/,%,++,-- B:+的用法 a:加法 b:正號 c:字符串連接符 C:/和%的區別 數據做除

NetApp DataONTAP 集群模式 學習筆記2

netapp dataontap 集群模式WAFL工作原理基本結構如下圖:客戶端發送寫請求控制器1將數據寫到系統內存和NVRAM中,並將數據同步到控制2上控制器2發送確認給控制器1控制器1發送確認給客戶端另一個客記端發送寫請求控制器1將數據寫入系統內存和NVRAM中,並同步給控制器2控制器2發送確認給控制器1

python學習筆記2

www. 內部 必須 class print 依次 not 函數對象 return 學習廖雪峰的官方網站https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000

36、我的C#學習筆記2

c#類是一種數據結構,它可以封裝數據成員、函數成員和其它的類。類是創建對象的模板。C#中所有語句都必須位於類內。因此,類是C#語言的核心和基本構成模塊。C#支持自定義類,使用C#編程就是編寫自己的類來描述實際需要解決的問題。類就好比是醫院的各個部門,如:內科、骨科、泌尿科、眼科等,在各科室中都有自己的工作方法

ElasticSearch學習筆記--2、ES相關配置

last 學習 -- code logs 相關數 clas 名稱 config 1、配置文件 ES的配置文件位置:config/elasticsearch.yml可以直接搜索elasticsearch.yml 2、配置遠程api訪問 network.host: 192

SpringCloud學習筆記(2)——Ribbon

cnblogs logs 所有 客戶 custom err 應用 erl list 參考SpringCloud官網第16、17章 16. Client Side Load Balancer: Ribbon Ribbon是一個客戶端的負載均衡器,它提供對大量的HTTP和TCP