make命令是用於程式編譯的工具, 當需要通過多個輸入檔案來生成輸出檔案時, 可以利用它來完成。
make命令的一些可選引數:
-b 無條件編譯所有目標
-c dir 讀取makefile之前切換到指定的目錄dir
-f 告訴make命令將哪個檔案作為makefile檔案;
-n 讓make命令輸出將要執行的操作步驟,但不是真的執行這些操作。
具體可以通過man make檢視。
makefile檔案是由一組依賴關係和規則構成。 每個依賴關係和由乙個目標(即將要建立的檔案)和一組該目標所依賴的原始檔組成。 規格描述了如何通過這些依賴來建立檔案。
make命令會讀取makefile檔案的內容, 先確定目標檔案或者要建立的檔案, 然後比較該目標所依賴的日期和時間以決定應該採用哪條規則來構建目標。make命令會根據makefile檔案來確定目標檔案的建立順序以及正確的規則呼叫順序。
依賴關係定義了最終應用程式裡面的每個檔案與原始檔之間的關係。
依賴關係的寫法是: 先寫目標的名稱, 然後緊跟乙個冒號, 接著是空格或者製表符tab, 最後用空格或者製表符隔開的檔案列表。
main: main.o
gcc -o main.o
main.o: main.c a.h
gcc -c main.c
下面就按照這種寫法來寫乙個簡單的makefile檔案
先準備幾個原始檔和標頭檔案
sum.h
#ifndef _sum_h
#define _sum_h
#endif
int sum(int a, int b);
sum.c
#include "sum.h"
int sum(int a, int b)
minus.h
#ifndef _minus_h
#define _minus_h
#endif
int minus(int a, int b);
minus.c
#include "minus.h"
int minus(int a, int b)
main.c
#include
#include
#include "sum.h"
#include "minus.h"
extern
int sum(int a, int b);
extern
int minus(int a, int b);
int main()
makefile1
all: main
main: main.o sum.o minus.o
gcc -o main main.o sum.o minus.o
main.o: main.c minus.h sum.h
gcc -c main.c
sum.o: sum.c sum.h
gcc -c sum.c
minus.o: minus.c minus.h
gcc -c minus.c
make命令執行makefile1檔案,並執行main程式,輸出如下結果:
$ make -f makefile1
gcc -c main.c
gcc -c
sum.c
gcc -c minus.c
gcc -o main main.o sum
.o minus.o
$ ./main3+
2=53
-2=1
其中, all指定乙個目標, 在未指定特定目標進行make時,可以指定應該建立哪些目標。若沒有all, make命令將試圖建立列在makefile檔案中的第乙個目標。
這個命令可以用於產生乙個適用於make命令的依賴關係清單。下面就試一下,還是用上面準備的原始檔, 在源檔案目錄下,輸入如下命令:
$ gcc -mm *.c
main.o: main.c sum.h minus.h
minus.o: minus.c minus.h
sum.o: sum.c sum.h
幾個原始檔之間的依賴關係一目了然。
注釋以#號開頭,直到這行末尾。
# test makefile
main: main.o
繼續使用前面的原始檔來實驗。 寫乙個使用巨集定義的makefile2
all: main
# 使用的編譯器
cc = gcc
# 包含檔案
include = .
# development
cflags = -g -wall -ansi
# release
# cflags = -o -wall -ansi
main: main.o sum.o minus.o
$(cc) -o main main.o sum.o minus.o
main.o: main.c sum.h minus.h
$(cc) -i$(include) $(cflags) -c main.c
sum.o: sum.c sum.h
$(cc) -i$(include) $(cflags) -c sum.c
minus.o: minus.c minus.h
$(cc) -i$(include) $(cflags) -c minus.c
make命令內建了一些特殊的巨集命令,利用它們可以使makefile檔案變得很簡潔。
$^:代表所有的依賴檔案
$@:代表目標
$<:代表第乙個依賴檔案
-: -(減號)可以放在命令之前,告訴make命令忽略所有錯誤。
比如可以在makefile2最後加上如下命令, 可以將編譯過程中的*.o檔案刪除。
clean:
-rm main.o sum.o minus.o
執行的時候可以按照如下方式進行
make -f makefile2 clean
@: @告訴make在執行某條命令前不要將該命令顯示在標準輸出上,如果想用echo命令給出一些說明資訊。
對於大型的專案, 如果希望把構成乙個函式庫的幾個檔案從主檔案中分離出來, 並將它們儲存到乙個子目錄中。 有兩種使用make命令的方法來完成這個工作(還沒有試過)。
1. 第一種方法
在子目錄中編寫第二個makefile檔案, 其作用是編譯該子目錄下的原始檔,並將它們儲存到乙個函式庫中, 然後將該庫檔案複製到上一級的主目錄中。在主目錄中的makefile檔案包含一條用於製作函式庫的規則, 該規則會呼叫第二個makefile檔案。
mylib.a:
(cd mylibdirectory;$(make))
當用make命令呼叫這條規則來建立函式庫時, 它將切換到子目錄mylibdirectory中,然後呼叫乙個新的make命令來管理函式庫。
cd切換目錄前面的括號是必須的, 這樣可以確保它們只被乙個單獨shell處理。
2. 第二種方法
在原來的makefile中增加一些巨集, 將新新增的巨集通過在已見過的巨集的尾部追加乙個字幕得到, 字母d代表目錄, 字母f代表檔名。
.c.o:
$(cc) $(
cflags) -c $(
@d)/$(
@d)/$(
@f)
* makefile下(w
ildc
ard ^),
, @,?,
<,(@
d), (@f)義 *
(一)make之make和makefile初識
1.1 make 和makefile 1.1.1 make make 是乙個應用程式 1.1.2 makefile makefile是乙個描述檔案 1.1.3 makefile本質 makefile實際就是乙個指令碼程式,類似於shell指令碼。由於 塊中沒有make的,所以用bash來代替make...
深入學習Make命令和Makefile(上)(1)
make是linux下的一款程式自動維護工具,配合makefile的使用,就能夠根據程式中模組的修改情況,自動判斷應該對那些模組重新編譯,從而保證軟體是由最新的模組構成。本文分為上下兩部分,我們將緊緊圍繞make在軟體開發中的應用展開詳細的介紹。深入學習make命令和makefile 下 一 都是原...
深入學習Make命令和Makefile(上) 3
五 makefile中的規則 除了指明目標和模組之間的依賴關係之外,makefile還要規定相應的規則來描述如何生成目標,或者說使用哪些命令來根據依賴模組產生目標。就上例而言,當make程式發現需要重新構建f1.o的時候,該使用哪些命令來完成呢?很遺憾,到目前為止,雖然make知道哪些檔案需要更新,...