1. 程式人生 > >深入學習Make命令和Makefile(上)(4)

深入學習Make命令和Makefile(上)(4)



七、makefile中的巨集

在makefile中可以使用諸如XLIB、UIL等類似於Shell變數的識別符號,這些識別符號在makefile中稱為“巨集”,它可以代表一些檔名或選項。巨集的作用類似於C語言中的define,利用它們來代表某些多處使用而又可能發生變化的內容,可以節省重複修改的工作,還可以避免遺漏。

Make的巨集分為兩類,一類是使用者自己定義的巨集,一類是系統內部定義的巨集。使用者定義的巨集必須在makefile或命令列中明確定義,系統定義的巨集不由使用者定義。我們首先介紹第一種巨集。

這裡是一個包含巨集的makefile檔案,我們將其命名為mymakefile2,如下所示:

all: main
# 使用的編譯器
CC = gcc
#包含檔案所在目錄
INCLUDE = .
# 在開發過程中使用的選項
CFLAGS = -g -Wall –ansi
# 在發行時使用的選項
# CFLAGS = -O -Wall –ansi
main: main.o f1.o f2.o
$(CC) -o main main.o f1.o f2.o
main.o: main.c def1.h
$(CC) -I$(INCLUDE) $(CFLAGS) -c main.c
f1.o: f1.c def1.h def2.h
$(CC) -I$(INCLUDE) $(CFLAGS) -c f1.c
f2.o: f2.c def2.h def3.h
$(CC) -I$(INCLUDE) $(CFLAGS) -c f2.c

我們看到,在這裡有一些註釋。在makefile中,註釋以#為開頭,至行尾結束。註釋不僅可以幫助別人理解我們的makefile,如果時間久了,有些東西我們自己也會忘掉,它們對makefile的編寫者來說也是很有必要的。

現在言歸正傳,先看一下巨集的定義。我們既可以在make命令列中定義巨集,也可以在makefile中定義巨集。在makefile中定義巨集的基本語法是:

巨集識別符號=值列表

其中,巨集識別符號即巨集的名稱通常全部大寫,但它實際上可以由大、小寫字母、阿拉伯數字和下劃線構成。等號左右的空白符沒有嚴格要求,因為它們最終將被make刪除。至於值列表,既可以是零項,也可以是一項或者多項。如:

LIST_VALUE = one two three

當一個巨集定義之後,我們就可以通過$(巨集識別符號)或者${巨集識別符號}來訪問這個識別符號所代表的值了。

在makefile中,巨集經常用作編譯器的選項。很多時候,處於開發階段的應用程式在編譯時是不用優化的,但是卻需要除錯資訊;而正式版本的應用程式卻正好相反,沒有除錯資訊的程式碼不僅所佔記憶體較小,進過優化的程式碼執行起來也更快。

對於Mymakefile1來說,它假定所用的編譯器是gcc,不過在其他的UNIX系統上,更常用的編譯器是cc或者c89,而非gcc。如果你想讓自己的makefile適用於不同的UNIX作業系統,或者在一個系統上使用其他種類的編譯器,這時就不得不對這個makefile中的多處進行修改。

但對於mymakefile2來說則不存在這個問題,我們只需修改一處,即巨集定義的值就行了。除了在makefile中定義巨集的值之外,我們還可以在make命令列中加以定義,如:

$ make CC=c89

當命令列中的巨集定義跟makefile中的定義有衝突時,以命令列中的定義為準。當在makefile檔案之外使用時,巨集定義必須作為單個引數進行傳遞,所以要避免使用空格,但是更妥當的方法是使用引號,如:

$ make “CC =   c89”

這樣就不必擔心空格所引起的問題了。現在讓我們將前面的編譯結果刪掉,來測試一下mymakefile2的工作情況。命令如下所示:

$ rm *.o main

$ make -f Mymakefile2
gcc -I. -g -Wall -ansi -c main.c
gcc -I. -g -Wall -ansi -c f1.c
gcc -I. -g -Wall -ansi -c f2.c
gcc -o main main.o f1.o f2.o
$

就像我們看到的那樣,Make程式會用相應的定義來替換巨集引用$(CC )、$(CFLAGS )和$(INCLUDE),這跟C語言中的巨集的用法比較相似。

上面介紹了使用者定義的巨集,現在介紹make的內部巨集。常用的內部巨集有:

$? :比目標的修改時間更晚的那些依賴模組表。
[email protected] :當前目標的全路徑名。可用於使用者定義的目標名的相關行中。
$< :比給定的目標檔案時間標記更新的依賴檔名。
$* :去掉字尾的當前目標名。例如,若當前目標是pro.o,則$*表示pro。

相關推薦

深入學習Make命令Makefile(4)

 七、makefile中的巨集 在makefile中可以使用諸如XLIB、UIL等類似於Shell變數的識別符號,這些識別符號在makefile中稱為“巨集”,它可以代表一些檔名或選項。巨集的作用類似於C語言中的define,利用它們來代表某些多處使用而又可能發生變化的

深入學習Make命令Makefile

make是Linux下的一款程式自動維護工具,配合makefile的使用,就能夠根據程式中模組的修改情況,自動判斷應該對那些模組重新編譯,從而保證軟體是由最新的模組構成。本文分為上下兩部分,我們將緊緊圍繞make在軟體開發中的應用展開詳細的介紹。 一、都是原始檔太多惹得禍

深入學習Make命令Makefile1

        make是Linux下的一款程式自動維護工具,配合makefile的使用,就能夠根據程式中模組的修改情況,自動判斷應該對那些模組重新編譯,從而保證軟體是由最新的模組構成。本文分為上下兩部分,我們將緊緊圍繞make在軟體開發中的應用展開詳細的介紹。

深入學習前端MVCMVVM

MVC是一種開發模式,就是一種模型—檢視—控制器(MVC)模式。 在php專案中,nodejs專案中,很容易實現MVC。比如一個nodeJS的MVC: 先說後臺的MVC 一、model層 模型層:模型中的邏輯嚴重依賴永續性。 這裡用的是mongoose

深入學習前端MVCMVVM

上一節說了後臺的MVC,現在開始講重點,前端的MVC又是一個什麼鬼。 很長一段時間我都沒有搞清楚MVC和MVVM。 一直在說ng是MVC,react和Vue是MVVM,MVVM我用過了,用過vue和react,他們的資料繫結,那麼MVC究竟是什麼樣子呢?

Servlet深入學習,規範,理解實現

學習參考資料: (1)Servet 3.1 final 規範; (2)《Java Web高階程式設計》; (3)《深入分析Java Web技術內幕》(第2版); 心得:雖然現在是實際工作中很少直接使用Servlet,但瞭解Servlet規範中對不同元件(

make命令makefile

空格 這一 file mman 情況 相關 描述 end targe make命令和Makefiles: 1. make是一個命令,解釋makefile中指令的命令工具,不同的IDE有自己的make命令。 1. make命令不知道怎麽去構建程序,必須有一個文件告訴make命

簡介make命令makefile文件

tab linux 後綴 依賴關系 函數調用 創建方式 href oca printf 一、為什麽要用到 make 命令和 makefile 文件   在 Linux 下編寫一個程序,每次編譯都需要在命令行一行一行的敲命令。如果是一個很小的程序還好說,命令不怎的復雜,編譯速

簡介make命令makefile檔案

一、為什麼要用到 make 命令和 makefile 檔案   在 Linux 下編寫一個程式,每次編譯都需要在命令列一行一行的敲命令。如果是一個很小的程式還好說,命令不怎的複雜,編譯速度也挺快,但是對於大型程式來說,這樣無疑很麻煩,且不說可能會敲錯命令,有時候僅僅改動了一個小地方,卻需要將整個程式全部重新

Pro Android學習筆記一五五 感測器5 磁場感測器方位

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Kotlin學習---函式的定義呼叫

1.1 處理集合:可變引數、中綴呼叫和庫的支援 本章節中會展示Kotlin標準庫中用來處理集合的一些方法。另外還包括幾個相關的語法特性: - vararg 可變引數,用來宣告一個函式將可能有任意數量的引數。 - 中綴表示法,當你呼叫一些 只有一個

《機器學習實戰》學習筆記之提升Adaboost基礎理論以及演算法推導

轉載請註明作者和出處:http://blog.csdn.net/john_bh/ CSDN部落格專欄:## Github程式碼獲取:## 執行平臺: Windows Python版本: Python3.6 IDE: Sublime text3

Java for Web學習筆記九十:訊息叢集5利用websocket實現訂閱釋出

叢集中的訂閱和釋出 利用spring framework在本app內的訂閱和釋出十分簡單。當我們系統越來越複雜的時候,我們需要向其他app釋出訊息。本學習將給出一個通過websocket來實現不同app之間訊息的訂購和釋出。 在小例子中,我們在所有節點之間都建立webSoc

學習Linux基本命令60個

一、安裝與登陸 1.login 登陸系統 許可權:所有使用者 login [name] [-p] [-h 主機](環境引數  使用者名稱) 2.shutdown 關閉計算機 超級使用者 shutdown [-h] [-i] [-k] [-m] [-t](關閉電源 顯示系統

JAVA學習筆記5物件

1.        面向物件程式設計(OOP)就是使用物件進行程式設計。物件有自己的特性,狀態和行為。物件的狀態是由具有當前值得資料域(又稱屬性)的集合構成。物件的行為是方法的集合定義的。呼叫物件的一個方法就是要求物件執行一次任務。 2.        類是定義同一型別

【HEVC學習與研究】39、HEVC幀內編碼的原理實現

【前面N篇博文都講了一些HEVC幀內預測的程式碼結構和簡單的方法,但是尚未對整體的演算法和實現做一個比較完整的描述。本篇藉助參考文獻《High Efficiency Video Coding (HEVC) -- Algorithms and Architectures》的

UVM序列篇之二:sequenceitem

技術 一點 目標 idt 需要 開始 掛載 ron 前行 無論是自駕item,穿過sequencer交通站,通往終點driver,還是坐上sequence的大巴,一路沿途觀光,最終跟隨導遊停靠到風景點driver,在介紹如何駕駛item和sequence,遵守什麽交規,最終

多線程編程學習筆記——asyncawait

處理 sync ext 操作 line cnblogs 編程 技術 容器 接上文 多線程編程學習筆記——async和await(一) 三、 對連續的異步任務使用await操作符 本示例學習如何閱讀有多個await方法方法時,程序

多線程編程學習筆記——asyncawait

result ask aps nta cti ise 線程編程 學習筆記 top 接上文 多線程編程學習筆記——async和await(一) 接上文 多線程編程學習筆記——async和await(二) 五、 處理異步操

linux文件壓縮打包

fff nag mark com -o mar col color .com 6.1壓縮打包介紹6.2gzip壓縮工具6.3bzip2壓縮工具6.4xz壓縮工具6.1壓縮打包介紹6.2gzip壓縮工具6.3bzip2壓縮工具6.4xz壓縮工具linux文件壓縮和打包(上)