Makefile腳本文件


0.緣由


多文件編程
主文件(main函數所在的文件)往往只包含一些函數的調用。結構體的定義,函數的實現通常在不同的文件中,這時就需要主文件包含一些頭文件,標準c庫的頭文件不用多說,如果是自己定義了頭文件,函數的實現過程放到對應的.c文件中,這時候想要編譯生成可執行文件,必須和對應頭文件的.c文件一起編譯。後期如果修改某些文件,還要全部編譯,不利於維護。


1.概述


通常來說,一個工程中的源文件有很多。而往往按類型、功能、模塊分別放在對應的目錄中,Makefile定義了一系列的規則來指定哪些文件需要先編譯,哪些文件需要後編譯,哪些文件需要重新編譯,甚至於進行更復雜的功能操作,因爲 Makefile就像一個Shell腳本一樣,也可以執行操作系統的命令。


2.優點


(1)工程中大量代碼的關係維護
大的工程中源代碼比較多,手工維護、編譯時間長而且編譯命令複雜,難以記憶及維護。把代碼維護命令及編譯命令寫在Makefile文件中,然後用make工具解析此文件自動執行相應命令,實現代碼的合理編譯。
(2)減少重複編譯時間
使用make編譯過一次程序後,會記錄每一個文件的時間戳,當修改某些文件後,再次使用make工具編譯時,只會編譯修改過時間戳的文件,相比較於gcc編譯節省了大量的時間,另外,make可以有選擇性的對指定的文件進行編譯。


3.Makefile語法格式


(1)格式語法
目標:依賴文件列表
命令列表

main:mian.c fun.c
	gcc main.c fun.c -o main
clean:
	rm main -rf

4.Makefile變量語法


(1)變量概述

Makefile 變量類似於 C 語言中的宏,當 Makefile 被 make 工具解析時,其中的變量會被展開。
變量的作用:
保存文件名列表
保存文件目錄列表
保存編譯器名
保存編譯參數
保存編譯的輸出 …

(2)Makefile 的變量分類

1、自定義變量
在 makefile 文件中定義的變量。
make 工具傳給 makefile 的變量。
2、系統環境變量
make 工具解析 makefile 前,讀取系統環境變量並設置爲 makefile 的變量。
3、預定義變量(自動變量)

(3) 自定義變量語法

在 makefile 文件中定義的變量
定義: 變量名=變量值
應用變量: $(變量名) / ${變量名}

CC=gcc
TARGET=main
OBJ=main.o fun.o
CFLAGES=-Wall -std=c99
$(TARGET):$(OBJ)
	$(CC) main.o fun.o -o main $(CFLAGES)
main.o:main.c
	$(CC) -c main.c -o main.o $(CFLAGES)
fun.o:fun.c
	$(CC) -c fun.c -o fun.o $(CFLAGES)

clean:
	rm $(TARGET) $(OBJ)

注意:
變量是區分大小寫的
變量名一般在頭部定義
變量幾乎可在任何地方使用
變量名可以以數字開頭
變量名一般按照功能起名

make 工具傳給 makefile 的變量

cc=gcc

執行 make 命令時,make 的參數 options 也可以給 makefile 設置變量。例如:make cc=arm-linux-gcc

(4)系統環境變量

make 工具會拷貝系統的環境變量並將其設置爲 makefile 的變量,在 makefile 中可直接讀取或修改拷貝後的變量。

clean:
	echo $(PWD)
	echo $(SHELL)

(5) 預定義變量

makefile 中有許多預定義變量,這些變量具有特殊的含義,可在 makefile 中直接使用。
$@ 目標名
$< 依賴文件列表中的第一個文件
$^ 依賴文件列表中除去重複文件的部分
$% 如果目標是歸檔成員,則該變量表示目標的歸檔成員名稱。例如,如果目標名稱爲(image.o), $% 爲 image.o。

AR 歸檔維護程序的程序名,默認值爲 ar
ARFLAGS 歸檔維護程序的選項
AS 彙編程序的名稱,默認值爲 as
ASFLAGS 彙編程序的選項
CC C 編譯器的名稱,默認值爲 cc
CFLAGSC 編譯器的選項
CPP C 預編譯器的名稱,默認值爲$(CC) -E CPPFLAGS C 預編譯的選項
CXX C++編譯器的名稱,默認值爲 g++ CXXFLAGS C++編譯器的選項

案例
注意事項:
make指令 默認尋找makefile 或 Makefile
如果make 需要指定 makefile文件名 + -f
make 默認執行第一個目標文件 其他目標文件 需要指定

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章