Makefile學習筆記

2021-09-22 05:52:40 字數 2015 閱讀 2184

makefile是做linux方向經常用到的檔案,makefile主要用來管理**的編譯,**的編譯順序,以及在後期某個檔案發生變動,就只編譯該檔案,而不用所有檔案都編譯一次;makefile的編寫基本是一勞永逸的,編寫一次,後面基於該makefile做相應的修改即可。

makefile檔案一般可以命名為makefile或者makefile,在linux核心中一般是選用的前者命名的;

makefile如果命名為其他名字也是可以的:比如makefile_demo,但是在make的時候需要使用如下命令:

make  -f makefile_demo.

makefile的格式一般是:

目標:依賴 規則

目標是make之後生成檔案名字,依賴是生成目標檔案所需要的檔案,規則是指導怎麼生成目標檔案或者如何生成目標檔案所需要的依賴。就好比:做一道菜:你需要知道做成一道什麼樣的菜<----->目標,做著道菜需要準備哪些蔬菜原料<------->依賴,做這道菜的過程是怎樣的<------>規則。

makefile在編譯**的時候,因為**一般是有很多的.c檔案組成的,所以在寫makefile的時候,放在makefile最前面的目標是該工程的乙個終極目標。而下面的目標是為終極目標服務的,一般是為了生成終極目標所需要的依賴。

makefile在編譯的時候的規則是這樣的,首先檢查目標檔案的依賴是否是存在的,如果依賴的檔案不存在,則繼續向下找是否有對應的規則生成目標所需要的依賴。總結一下就是:在編譯的過程從第乙個目標往下先找對應的依賴,然後從下向上執行對應的命令。

makefile檔案中常用的自動變數:

$@ ---------->目標;

$< ------------>依賴中檔案中的第乙個依賴;

$^ -------------> 表示所有的依賴

makefile中變數在直接賦值的時候就完成了變數的定義;

引用變數的值的時候 是在用()括起來改變量,然後在()前面加乙個$符號。

在makefile中經常還會用到%這個符號,在makefile中%是萬用字元,經常用在模式規則中來匹配檔案,所謂的模式規則就是:

在乙個有main.c test1.c test2.c的工程裡:

%.o:%.c

$(cc) -c $< -o $@

這個模式規則的作用就相當於以下命令:

main.o:main.c

gcc -c main.c -o main.o

test1.o:test1.c

gcc -c test1.c -o test1.o

test2.test2.c

gcc -c test2.c -o test2.o

最後說一下makefile檔案中經常使用的兩個函式,在makefile中所有的函式都是有返回值的:

wildcard:

用於查詢指定目錄下指定型別的檔案,跟的引數就是目錄+檔案型別,比如:

src = $(wildcard ./src/*.c)

這句話表示:找到./src 目錄下所有字尾為.c的檔案,並賦給變數src。

命令執行完成後,src的值為:main.c func1.c fun2.c。

patsubst:

匹配替換,例如以下例子,用於從src目錄中找到所有.c 結尾的檔案,並將其替換為.o檔案,並賦值給obj。

obj = $(patsubst %.c ,%.o ,$(src))

把src變數中所有字尾為.c的檔案替換成.o。

命令執行完成後,obj的值為main.o func1.o func2.o

特別地,如果要把所有.o檔案放在obj目錄下,可用以下方法:

ob = $(patsubst ./src/%.c, ./obj/%.o, $(src))

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 變數名 值 引用變數可在之後定義 ...