歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Makefile入門教程

Makefile入門教程

日期:2017/3/1 9:41:06   编辑:Linux編程

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

Copyright © Linux教程網 All Rights Reserved