歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Makefile入門教程

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