關於Makefile的學習

2021-07-11 23:13:18 字數 1956 閱讀 7393

首先,讓我們先來簡單的了解一下什麼是makefile?

乙個工程中的原始檔不計其數,其按型別、功能、模組分別放在若干個目錄中,makefile定義了一系列的規則來指定,哪些檔案需要先編譯,哪些檔案需要後編譯,哪些檔案需要重新編譯,甚至於進行更複雜的功能操作,因為 makefile就像乙個shell指令碼一樣,其中也可以執行作業系統的命令。linux 環境下的程式設計師如果不會使用gnu make來構建和管理自己的工程,應該不能算是乙個合格的專業程式設計師。

在 linux(unix )環境下使用gnu 的make工具能夠比較容易的構建乙個屬於你自己的工程,整個工程的編譯只需要乙個命令就可以完成編譯、連線以至於最後的執行。不過這需要我們投入一些時間去完成乙個或者多個稱之為makefile 檔案的編寫。所要完成的makefile 檔案描述了整個工程的編譯、連線等規則。其中包括:工程中的哪些原始檔需要編譯以及如何編譯、需要建立那些庫檔案以及如何建立這些庫檔案、如何最後產生我們想要的可執行檔案。

儘管看起來可能是很複雜的事情,但是為工程編寫makefile 的好處是能夠使用一行命令來完成「自動化編譯」,一旦提供乙個正確的makefile。編譯整個工程你所要做的唯一的一件事就是在shell 提示符下輸入make命令。整個工程完全自動編譯,極大提高了效率。

現在我們來看乙個簡單的makefile:

lib_name=vendor1  

//定義變數名

all:shared   static

//make目標all 存在有shared  static  兩個依賴

rm -f *.o                                              //make目標all 下的動作

shared:

gcc -shared -fpic -o lib$.so *.c        //目標shared下的動作

static:

gcc -c *.c

ar -rcs lib$.a *.o                         //目標static下的動作

clean:

rm -rf *.o

rm -rf *.a *.so

//目標clean下的動作

install:

cp lib$.* ~/dd                                //目標install下的動作

那麼makefile是怎麼執行make的呢?

一般來說,makefile下的第一條目標為總目標,輸入make時執行all目標,其目標下有shared和static依賴,那麼首先跳到shared下執行shared目標的動作(也就是命令),再回到all中 發現還存在依賴,就接著到static目標下執行動作,持續執行依賴,直到完成all目標下的依賴,在接著完成all目標下的動作。

ps:①動作可是linux下的命令,但是動作存在的一行的第乙個字元必須是tab鍵;

②目標下的依賴可以是檔案(目錄)或者是其他目標。

target: depend1 depend2 depend3 ...

[tab] action1

[tab ] action2

target1:

[tab] action1

[tab] action2

make後可以接目標作為命令:

關於make的一些選項:

make 找makefile或makefile檔案執行總的目標

make clean 執行makefile檔案中的clean目標

make -c directory 進入到directory資料夾中去執行總的目標

make clean -c direcotry 進入到directory資料夾中去執行clean目標

make -f comm_makefile 通過-f選項指定乙個makefile檔案

make var=value 給makefile傳乙個引數var,其值為value

關於makefile的解釋

makefile是一種配置檔案,makefile 乙個工程中的原始檔不計數,其按型別 功能 模組分別放在若干個目錄中,makefile定義了一系列的規則來指定,哪些檔案需要先編譯,哪些檔案需要後編譯,哪些檔案需要重新編譯,甚至於進行更複雜的功能操作,因為 makefile就像乙個shell指令碼一樣...

makefile學習筆記 makefile概述

20180411 makefile學習筆記 makefile概述 makefile主要是在unix下軟體編譯時寫的,window下一般不用 unix裡makefile做的事 相當於window裡ide所做的事 會不會寫makefile,從乙個側面說明了乙個人是否具備完成大型工程的能力。makefil...

關於makefile的那些事兒

最近越來越感覺到,在linux下面身為乙個程式設計師,不會makefile就不是乙個合格的程式設計師,所以今天我們介紹下常用的makefile編寫.了解知識 編譯 把高階語言書寫的 轉換為機器可識別的機器指令。編譯高階語言後生成的指令雖然可被機器識別,但是還不能被執行。編譯時,編譯器檢查高階語言的語...