介紹
一般程序都是由多個源文件編譯鏈接而成的,這些源文件的處理步驟通常由Makefile文件管理。
make工具用來進(jìn)行協(xié)調(diào)的工具,可以根據(jù)程序模塊的修改情況重新編譯鏈接目標(biāo)代碼,以保證目標(biāo)代碼總是由它的最新模塊組成。


要使用make,準(zhǔn)備Makefile的文件(也可以準(zhǔn)備其他文件如GNUMakefile或makefile,推薦使用Makefile),它描述了軟件包中各個文件之間的關(guān)系,提供了更新每個文件的命令。
當(dāng)一個適當(dāng)?shù)腗akefile存在時,每次改變某些源文件,用簡單的shell命令(make),將足以完成所有必需的重新編譯。
make 程序利用Makefile的數(shù)據(jù)和每個文件最新一次更改的時間來確定哪些文件需要更新;對每個需要更新的文件,make程序使用Makefile中定義的命令來更新它。
#用“井”號表明注釋。
target(要生成的文件): dependencies(被依賴的文件)
#命令前面用的是“tab”而非空格。誤用空格是初學(xué)者容易犯的錯誤!
命令1
命令2
命令3
.
.
.
命令n
#可以使用“\”表示續(xù)行。注意,“\”之后不能有空格!
- target通常是我們要生成的文件的名字,擺放的順序不重要,但第一個target是默認(rèn)的target。當(dāng)make不帶參數(shù)時,自動執(zhí)行第一個target。target也可以是要求make完成的動作,執(zhí)行這種target后并不能得到和target同名的文件,因此,也稱為偽target(phony target)。
- dependencies是生成target所需的文件名列表。依賴可以為空,常用的“clean”target就常常沒有依賴,只有命令。
- 命令可以是任何一個shell能運(yùn)行的命令。

比如生成exe文件,它由2個目標(biāo)代碼某塊組成,分別為module1.o和module2.o
module1.h文件
int module1 = 1;
module1.c文件
#include "module1.h" void print1(){ printf("var module1:%d\n", module1); }

module2.h文件
int module2 = 2;
module2.c文件
#include <stdio.h> #include "module2.h" void print2(){ printf("var module2:%d\n", module2); } int main(){ print1(); print2(); return 0; }
編譯Makefile文件
exe:module2.o module1.o gcc -g module1.o module2.o -o exe module2.o:module2.h module2.c gcc -g -c module2.c module1.o:module1.h module1.c gcc -g -c module1.c clean: rm -f exe *.o
截圖

在編寫完源程序文件后,從中生成需要的Makefile規(guī)則。
最基本的編寫規(guī)則的方法是從最終的源程序文件開始一個一個的查看源碼文件,把它們要生成的目標(biāo)文件做為目標(biāo),而C語言源碼文件和源碼文件包含的頭文件作為依賴文件生成規(guī)則。
目標(biāo)和條件之間的關(guān)系是:欲更新目標(biāo),必須首先更新它的所有條件;所有條件中只要有一個條件被更新了,目標(biāo)也必須隨之被更新。所謂“更新”就是執(zhí)行一遍規(guī)則中的命令列表,命令列表中的每條命令必須以一個Tab開頭,注意不能是空格,Makefile的格式不像C語言的縮進(jìn)那么隨意,對于Makefile中的每個以Tab開頭的命令,make會創(chuàng)建一個Shell進(jìn)程去執(zhí)行它。

變量:“變量”指的是用一個字符串代替另一個字符串的功能。在makefile中可以使用“=”號來定義變量,使用“$(變量名)”來使用變量;還可以用“:=”追加變量的內(nèi)容。習(xí)慣上,變量名使用大寫。
定義:
變量名=字符串
使用:
$(變量名)
追加:
變量名:=字符串
OBJS=module1.o module2.o C=-c CC=gcc exe:$(OBJS) $(CC) -g $(OBJS) -o exe module2.o:module2.h module2.c $(CC) -g $(C) module2.c module1.o:module1.h module1.c $(CC) -g $(C) module1.c clean: rm -f exe *.o

放例子:
all:exe1 exe2 exe1:exe1.c exe1.h gcc exe1.c -o exe1 exe2:exe2.c exe2.h gcc exe2.c -o exe2 clean: rm -f exe*
其中的all和clean都為偽目標(biāo)。偽目標(biāo)文件是不存在的。注意上面例子中第一條規(guī)則下的命令行為空,make不會執(zhí)行任何動作,只是檢查依賴文件的更新情況, 掃描剩下的幾條規(guī)則并執(zhí)行相應(yīng)的編譯命令生成可執(zhí)行文件。
條件語句可以將一個變量與其他變量的值進(jìn)行比較,或?qū)⒁粋€變量與一個字符串常量相比較。——這樣就可以根據(jù)變量的值執(zhí)行或忽略Makefile文件中的一部分腳本。
注意:條件語句用于控制make時間看見的Makefile文件部分,而不能用于執(zhí)行時控制shell命令。
條件語句3條指令:ifeq, else 和endif
放樣例:
ifeq($(VAR), 1) gcc -o exe1 module else gcc -o exe2 module endif
總結(jié)
想要熟練地掌握make工具,必需通過不斷的練習(xí)并參考其他Makefile的例子。
我會在后期的開發(fā)學(xué)習(xí)中不斷完善這篇博文。
推薦

喜歡編程

浙公網(wǎng)安備 33010602011771號