make 與makefile的作用

2021-07-25 15:12:51 字數 3573 閱讀 5701

在開發乙個系統時,一般是將乙個系統分成幾個模組,這樣做提高了系統的可維護性,但由於各個模組間不可避免存在關聯,所以當乙個模組改動後,其他模組也許會有所更新,當然對小系統來說,手工編譯連線是沒問題,但是如果是乙個大系統,存在很多個模組,那麼手工編譯的方法就不適用了。為此,在linux系統中,專門提供了乙個make命令來自動維護目標檔案,與手工編譯和連線相比,make命令的優點在於他只更新修改過的檔案(在linux中,乙個檔案被建立或更新後有乙個最後修改時間,make命令就是通過這個最後修改時間來判斷此檔案是否被修改),而對沒修改的檔案則置之不理,並且make命令不會漏掉乙個需要更新的檔案。

檔案和檔案間或模組或模組間有可能存在倚賴關係,make命令也是依據這種依賴關係來進行維護的,所以我們有必要了解什麼是依賴關係;make命令當然不會自己知道這些依賴關係,而需要程式設計師將這些依賴關係寫入乙個叫makefile的檔案中。makefile檔案中包含著一些目標,通常目標就是檔名,對每乙個目標,提供了實現這個目標的一組命令以及和這個目標有依賴關係的其他目標或檔名。

即make和makefile的關係是:make是乙個命令工具,是乙個解釋makefile中指令的命令工具,一般來說,大多數的ide都有這個命令,

1、makefile 

makefile定義了一系列的規則來指定,哪些檔案需要先編譯,哪些檔案需要後編譯,哪些檔案需要重新編譯,甚至於進行更複雜的功能操作,因為 makefile就像乙個shell指令碼一樣,其中也可以執行作業系統的命令。

makefile帶來的好處就是--「自動化編譯」,一旦寫好,只需要乙個make命令,整個工程完全自動編譯,極大的提高了軟體開發的效率。

makefile的產生:

對於很大的專案來說,自己手寫makefile非常麻煩,而標準的gnu軟體(如apacle)都是執行乙個configure指令碼檔案來產生makefile;gnu軟體automake和autoconf就是自動生成configure的工具。開發人員只需要先定義好巨集,automake處理後會產生供autoconf使用的makefine.in,再用autoconf就可以產生configure。

2、make命令

make

根據makefile檔案編譯源**、連線、生成目標檔案、可執行檔案。 

make clean

清除上次的make命令所產生的object檔案(字尾為「.o」的檔案)及可執行檔案。 

make install

將編譯成功的可執行檔案安裝到系統目錄中,一般為/usr/local/bin目錄。 

make dist

產生發布軟體包檔案(即distribution package)。這個命令將會將可執行檔案及相關檔案打包成乙個tar.gz壓縮的檔案用來作為發布軟體的軟體包。 

它會在當前目錄下生成乙個名字類似「package-version.tar.gz」的檔案。package和version,是我們在configure.in中定義的am_init_automake(package, version)。 

make distcheck

生成發布軟體包並對其進行測試檢查,以確定發布包的正確性。這個操作將自動把壓縮包檔案解開,然後執行configure命令,並且執行make,來確認編譯不出現錯誤,最後提示你軟體包已經準備好,可以發布了。 

make distclean

類似make clean,但同時也將configure生成的檔案全部刪除掉,包括makefile檔案。 

另外一些說明:

$ make -f makefile.debug

例如,乙個名為prog的程式由三個c原始檔filea.c、fileb.c和filec 

makefile檔案工程樣例

.c以及庫檔案ls編譯生成,這三個檔案還分別包含自己的標頭檔案a.h 、b.h和c.h。通常情況下,c編譯器將會輸出三個目標檔案filea.o、fileb.o和filec.o。假設filea.c和fileb.c都要宣告用到乙個名為defs的檔案,但filec.c不用。即在filea.c和fileb.c裡都有這樣的宣告:

#include "defs"

那麼下面的文件就描述了這些檔案之間的相互聯絡:

0 #it is a example for describing makefile 注釋行

1 prog : filea.o fileb.o filec.o #指定prog由三個目標檔案filea.o、fileb.o和filec.o鏈結生成

2 cc filea.o fileb.o filec.o -ls -o prog #如何從prog所依賴的檔案建立

可執行檔案

3 filea.o : filea.c a.h defs #指定filea.o目標檔案,以及它們所依賴的.c和.h檔案以及defs檔案

4 cc -c filea.c #如何從目標所依賴的檔案建立目標,即如何從filea.c建立filea.o

5 fileb.o : fileb.c b.h defs #指定fileb.o目標檔案,以及它們所依賴的.c和.h檔案以及defs檔案

6 cc -c fileb.c #如何從目標所依賴的檔案建立目標,即如何從fileb.c建立fileb.o

7 filec.o : filec.c c.h #指定filec.o目標檔案,以及它們所依賴的.c和.h檔案

8 cc -c filec.c #如何從目標所依賴的檔案建立目標,即如何從filec.c建立filec.o

這個描述文件就是乙個簡單的makefile檔案。我們針對上例的**方面進行一些基礎性說明:cc 是乙個全域性變數,它指定你的makefile所用的編譯器,一般預設是gcc;.o檔案是unix下的中間**目標檔案,就如同在windows下的.obj檔案一樣,在unix下生成.o檔案的過程叫編譯(compile),將無數.o檔案集合生成可執行檔案的過程叫鏈結(link);有時會在unix介面下看到.a檔案,那是archive file,相當於windows下的庫檔案library file,.a檔案作用是:由於原始檔太多(上例是指.c和.h檔案過多),編譯生成的中間目標檔案(.o檔案)太多,而在鏈結時需要明顯地指出中間目標檔名,這對於編譯很不方便,所以,我們要給中間目標檔案打個包,這個包就是.a檔案。

當filea.c或a.h檔案在編譯之後又被修改,則 make 工具可自動重新編譯filea.o,如果在前後兩次編譯之間,filea.c 和a.h 均沒有被修改,而且filea.o還存在的話,就沒有必要重新編譯。這種依賴關係在多

原始檔的

程式編譯中尤其重要。通過這種依賴關係的定義,make 工具可避免許多不必要的編譯工作。當然,利用shell

指令碼也可以達到自動編譯的效果,但是,shell 指令碼將全部編譯任何原始檔,包括哪些不必要重新編譯的原始檔,而 make 工具則可根據目標上一次編譯的時間和目標所依賴的原始檔的更新時間而自動判斷應當編譯哪個原始檔。

makefile檔案準備好之後,接著在makefile檔案所在的目錄下敲入make這個命令就可以了,根據makefile檔案,以告訴make命令需要怎麼樣的去編譯和鏈結

目標程式。

Linux的make與makefile的基礎知識

1.了解make工程管理器 所謂工程管理器是指管理工程的工具。假如我們面對是乙個上百個檔案的 構成的專案,假如其中幾個檔案進行了修改,按照之前所學的gcc編譯工具,就不得不把專案內所有的檔案重新編譯一遍,因為編譯器並不知道哪些檔案是最近更新的,但那些沒有改動的源 根本不需要重新編譯,而只須把它們重新...

make命令與Makefile檔案簡介

make工程管理,就是管理工程專案中的幾個檔案。大家在平時的練習中,編譯的檔案個數一般不超過五個,即使有幾個檔案進行了更改,也只需要對其重新編譯即可。但是工程若由成百上千個檔案組成,而只有其中個別檔案進行了修改,如果此時不知道哪幾個檔案被更改了,就只能用gcc把所有的檔案重新編譯一遍,這樣大大降低了...

make 和 makefile 的關係

要先總結make和makefile,就需要先了解下面這個過程 預編譯 也叫預處理,進行一些文字替換工作,比如將 define定義的內容,在 中進行替換 編譯 將預處理得到的 進行詞法分析 語法分析 中間 如果是在windows下,中間 就是.obj檔案 在linux系統下,中間 就是.o檔案 彙編 ...