Makefile入門教程
回顧
首先,我把需要的文件全部寫出來(在《GCC學習筆記》處)。
main.c文件
#include <stdio.h>
#include "math.h"
int main()
{
int sum = 0;
sum = add(4, 3);
printf("sum:%d", sum);
int result = 0;
result = divide(4, 0);
printf("result:%d\n", result);
return 0;
}
add.c文件
#include "math.h"
int add(int x, int y)
{
return x + y;
}
divide.c文件
#include <stdio.h>
#include "math.h"
int divide(int x, int y){
if(y == 0){
printf("y can't be zero\n");
return 0;
}
return x / y;
}
minus.c文件
#include "math.h"
int minus(int x, int y){
return x - y;
}
multiply.c文件
#include "math.h"
int multiply(int x, int y){
return x * y;
}
math.h文件
int add(int x, int y);
int minus(int x, int y);
int divide(int x, int y);
int multiply(int x, int y);
現在,在我的當前目錄下有main.c add.c minus.c divide.c multiply.c 和math.h六個文件,下面的內容就會圍繞這幾個文件來舉例講述。
問題
在《gcc學習筆記》一節,我已經提到過,如果要對add.c minus.c divide.c multiply.c這四個中其中一個作修改,那麼就需要重新編譯相應的源文件,生成新的目標文件,然後再進行鏈接,才可以生成修改後的執行文件。大家想想,如果說我們做的是一個大工程,那文件可是成千上百個啊!如果我們還是像現在這樣,一個個地重新編譯文件,那效率是極其低下的。於是就出現了makefile工具解決這個問題。
什麼是makefile
一個工程中的源文件不計數,其按類型、功能、模塊分別放在若干個目錄中,makefile定義了一系列的規則來指定,哪些文件需要先編譯,哪些文件需要後編譯,哪些文件需要重新編譯,甚至於進行更復雜的功能操作,因為makefile就像一個Shell腳本一樣,其中也可以執行操作系統的命令.
使用規則
目標文件 : 先決條件
命令
目標文件:可以是object file、可執行文件或者是一個標簽
先決條件:生成目標文件所需的目標或文件
命令:要執行的命令
這裡要注意的是:命令這一行需要tab鍵開頭,否則編譯器是無法識別的。
makefile的執行,是通過比較目標文件和先決條件這兩部分文件的日期,如果先決條件文件日期比較新或者目標文件不存在,那麼makefile就會去執行後續定義的命令
實例
創建並編輯makefile文件(也可以命名為Makefile)
以下,我將makefile文件截圖,如下:
如果命令行不是以tab鍵開始,vim編輯器是會有些提醒的。
在顏色上就沒有變棕色了。
這裡,我就拿下面這部分代碼來說明
add.o : add.c math.h
gcc -c add.c
在上面,我們看add.c代碼知道,add.c包含了math.h這個頭文件,故它也是目標文件的先覺條件。
在執行前,會先比較add.o和add.c、math.h這兩部分文件的日期,如果add.c或math.h文件日期比add.o新,或者add.o目標文件不存在,那麼就會執行下面gcc -c add.c這個命令。
另外要說的一個是下面這段代碼
clean:
rm calculate main.o add.o divide.o minus.o multiply.o
clean在這裡不是一個文件,是一個標簽,它冒號後面什麼也沒有,那就是說make不會自動去找文件的依賴性,也就不會自動執行其後所定義的命令。
這裡clean的作用是刪除可執行文件和目標文件。如果想要執行這一命令,直接用make clean即可。如果要生成可執行文件,則執行make。
以上的內容,只是介紹makefile的最常用功能。如果想更深入地探討makefile的功能,大家可以根據自己日後的需求自行學習。
Linux程序設計(原書第2版)(PDF中文版 + 源碼) http://www.linuxidc.com/Linux/2011-04/34147.htm
u-boot Makefile完全解讀 http://www.linuxidc.com/Linux/2013-04/83529.htm
實驗平台上Makefile詳細的解釋 http://www.linuxidc.com/Linux/2014-01/94827.htm
Makefile之Linux內核模塊的Makefile寫法分析 http://www.linuxidc.com/Linux/2013-06/85842.htm
Makefile之寫demo時的通用Makefile寫法 http://www.linuxidc.com/Linux/2013-05/84679.htm
Makefile之大型工程項目子目錄Makefile的一種通用寫法 http://www.linuxidc.com/Linux/2013-05/84678.htm