makefile 學習筆記

2022-07-31 16:42:12 字數 3019 閱讀 9047

學習的目標:

了解make的歷史

了解make的作用以及工作過程

掌握makefile的基本規則和變數的使用

一.什麼是makefile?

a) makefile是工程編譯的規則。這些規則指定,哪些檔案需要先編譯,哪些檔案後編譯,哪些檔案需要重新編譯

b) 目的:編譯源程式

c) 基礎:都是以檔案的依賴性為基礎

二.為什麼要用makefile?

a) 可以高效的自動化編譯

b) 簡化編譯時所需要的執行的命令

三.makefile包含什麼?

a) 顯示規則

i. 顯示規則明顯說明,目標檔案,依賴檔案和執行的指令

b) 隱晦規則

i. 由make自動推導。是根據檔案自動推導出依賴檔案,決定是否編譯。

c) 變數的定義

d) 檔案指示

i. 可以像c語言中使用include 包含其它的makefile檔案

e) 注釋

四.make的工作方式

a) 讀入所有的makefile

b) 讀入被include的其它makefile

c) 初始化檔案中的變數

d) 推導隱晦規則,並分析所有的規則

e) 為所有的目標檔案建立關係鏈

f) 根據依賴關係,決定哪些目標要重新生成

g) 執行生成命令

五.檔案的搜尋

a) 在大工程中會有大量的原始檔,通常的做法是把這些原始檔分類放好,並存在不同的目錄下面。所以當make去尋找檔案的依賴性時,最後是把檔案的路徑告訴make。做法是在makefile中使用vpath特殊變數。如果沒有定義vpath,make只會在當前目錄尋找。當設定了vpath,make如果沒有在當前目錄沒有找到,那麼就會在vpath中定義的的路徑中尋找。(這個好像用的並不多,因為一般我們都會在每個目錄下面建個makefile)設定的方法是:vpath=src:../headers

b) 當然不一定要使用vpath,通往檔案搜尋的路徑不止一條。你可以使用vpath這個make的關鍵字 格式是:vpath %.c foo 意思是.c檔案在foo目錄中尋找。當然首先尋找的第一目錄還是當前目錄。

六.偽目標

a) 什麼是偽目標?

偽目標表示,沒有目標這個檔案。但是make的基礎就是檔案的依賴性,如果沒有檔案就沒有不存在依賴性之說了。所以所有的偽目標都是make 直接呼叫。當然也不完全是,偽目標也可以是其它目標的依賴,那麼也就可以有其它的目標來呼叫。為了區分偽目標和其它目標檔案,使用.phony關鍵字說明偽目標。

七.命令

a) 顯示命令

i. make時,首先會把要執行的命令顯示出來然後在列印。但是有時我們不需要列印這個資訊,那麼@ 就可以派上用場了,如果在命令前面加上@那麼這個命令不會顯示,不會執行。例如:@echo $path 結果是只會列印path的值。

b) 命令的執行

i. make可以執行makefile中所定義的命令,命令可以是shell裡面所有的命令,這就使make實現更複雜的功能。命令執行時需要注意的是當前命令執行的程序,因為在子程序中做了事情,其環境是不會返回到父環境中來 。最典型的例子是:cd /etc/ ;pwd 和 cd /etc pwd結果不會相同的。

c) 命令出錯

i. 雖然make在執行的過程中並不會管編譯的錯誤。但是如果命令執行錯誤時,將會終止後面的命裡。但是有時有的錯誤我們並不關心,比如,刪除乙個檔案,這個檔案可能不存在,但是我們的目的只是把這個檔案刪除掉。還有即使增加乙個目錄,如果這個目錄已經存在那也不用mkdir了,但這是mkdir就會出錯。所以這種錯誤同樣會使make停止工作。這是我們不希望的。解決的辦法還是有的可以在命令的前面加上-號,意思是忽略命令執行的錯誤。

d) 巢狀執行make

i. 剛才說了如果在乙個makefile中使用其它的makefile那麼可以使用include包含進來。但是這裡有個問題兩個makefile中不能有相同的目標,否則必有有些目標make找不到的。那麼有沒有其它的辦法呢。這時就可以使用make的巢狀的執行。在乙個大專案中往往在最頂層有個makefile,其它的各個目錄都有makefile,但是我們只要在頂層執行make就行了,因為頂層的makefile會呼叫子目錄中的makefile。比如,在頂層makefile中 cd subdir && $(make)中。在巢狀執行make中,有個很重要的東西,那就是變數。頂層的makefile可能要傳遞某些變數給底層的makefile,這時可以使用export。需要注意的是有兩個變數一定會傳給底層的makefile,乙個是makeflages,另外乙個是shell。另外,有時我們需要知道什麼時候進入了哪個makefile執行,雖然可以根據make回顯的命令來判別,但是makefile中的命令大部分都差不多,所以判別起來有點難度,這裡有個簡答的方法,那就是在make 時加入引數 -w,那麼在進入子目錄中make時就會列印出:進入哪個目錄執行了make

八.變數

a) 變數的定義:有四個賦值符號要區分清楚

i. = 賦值,後面的變數可以是前面定義,也可以是後面定義

ii. := 後面出現的變數只可以是前面定義的,如果是後面定義的,那麼該值為空

iii. ?= 後面出現的變數如果沒有定義,那麼就定義,如果已經定義過,那麼就不再定義,用原來的值

iv. += 追加賦值

b) 變數的讀取 $()或${},如果是用shell的變數,可以用$$加以區分

c) 變數的高階應用:有些時候替換變數中內容。那麼可以這樣$(foo:%.o=%.c)把.o換成.c

makefile的學習暫時到這裡,後面還有些高階應用,但是一般是用不到的,還有些函式的應用,用到的時候可以再查沒必用記住。

make的歷史

make歷史,就是要說make的變化。其實,世界任何新事物的產生和它的持久不衰,都是因為需求。當乙個產品滿足不了需求時,那麼就必須改進。那麼這裡可以說到make的改進,以及為什麼要改。改了之後有什麼作用?等等。

makefile學習筆記 makefile概述

20180411 makefile學習筆記 makefile概述 makefile主要是在unix下軟體編譯時寫的,window下一般不用 unix裡makefile做的事 相當於window裡ide所做的事 會不會寫makefile,從乙個側面說明了乙個人是否具備完成大型工程的能力。makefil...

Makefile學習筆記

makefile for boot asm nasm 定義變數 asmflags i include run qemu system i386 hdd boot.img boot.img boot.asm asm boot.asm f bin o boot.img install run clean...

Makefile學習筆記

本文為學習筆記,僅供參考,如有好的建議歡迎指出!makefile規則 目標檔案 依賴檔案 tab 命令 命令前必須有乙個tab exp test main.c gcc main.c o test 隱式規則 o c 同名匹配 變數 類似於c中的巨集,引用方式 arg 變數名 值 引用變數可在之後定義 ...