Linux下Makefile的簡單應用

2021-08-09 08:31:57 字數 2555 閱讀 6846

linux下makefile的簡單應用

一、概述

什麼是makefile?或許很多人都不知道,但如果你想要成為乙個專業人士,特別是在linux下的軟體編譯就不能不自己寫makefile了。會不會寫makefile很大程度上可以從側面表現出乙個人是否有能力完成乙個大工程。所以說寫乙個適合自己的makefile還是很重要的。

make 是乙個命令工具,它解釋 makefile 中的指令(應該說是規則)。在 makefile

檔案中描述了整個工程所有檔案的編譯順序、編譯規則。 makefile 有自己的書寫格式、

關鍵字、函式。像 c 語言有自己的格式、關鍵字和函式一樣。而且在 makefile 中可以

使用系統 shell 所提供的任何命令來完成想要的工作。 makefile(在其它的系統上可能

是另外的檔名)在絕大多數的 ide 開發環境中都在使用,已經成為一種工程的編譯

方法。二、make是如何工作的

在預設的方式下,也就是我們只輸入make命令。那麼,

(1) make會在當前目錄下找名字叫「makefile」或「makefile」的檔案。

(2) 如果找到,它會找檔案中的第乙個目標檔案,在上面的例子中,他會找到 「edit」 這個檔案,並把這個檔案作為最終的目標檔案。

(3) 如果edit檔案不存在,或是edit所依賴的後面的 .o 檔案的檔案修改時間要比edit 這個檔案新,那麼,他就會執行後面所定義的命令來生成edit這個檔案。

(4) 如果edit所依賴的.o檔案也存在,那麼make會在當前檔案中找目標為.o檔案的 依賴性,如果找到則再根據那乙個規則生成.o檔案。(這有點像乙個堆疊的過程)

(5)你的c檔案和h檔案是存在的,於是make會生成 .o 檔案,然後再用 .o 檔案聲 明make的終極任務,也就是執行檔案edit了。

這就是整個make的依賴性,make會一層又一層地去找檔案的依賴關係,直到最終編譯出第乙個目標檔案。在找尋的過程中,如果出現錯誤,比如最後被依賴的檔案找不到,那麼make就會直接退出,並報錯,而對於所定義的命令的錯誤,或是編譯不成功,make根本不理。make只管檔案的依賴性,即,如果在我找了依賴關係之後,冒號後面的檔案還是不在,那麼對不起,我就不工作啦。

make clean

清空目標檔案的規則

每個makefile中都應該寫乙個清空目標檔案(.o和執行檔案)的規則,這不僅便於重編譯,也很利於保持檔案的清潔。這是乙個「修養」(呵呵,還記得我的《程式設計修養》嗎)。一般的風格都是:

clean:

rm edit (o

bjec

ts)更

為穩健的

做法是:

.pho

ny:c

lean

clea

n:−r

medi

t (objects)

前面說過,.phony意思表示clean是乙個「偽目標」,。而在rm命令前面加了乙個小減號的意思就是,也許某些檔案出現問題,但不要管,繼續做後面的事。當然,clean的規則不要放在檔案的開頭,不然,這就會變成make的預設目標,相信誰也不願意這樣。不成文的規矩是——「clean從來都是放在檔案的最後」。

簡單的makefile例項

首先建立三個檔案,分別為main.c,test.h,test.c。**如下:

vim main.c

int main(void)

{ test();

return 0;
vim test.h

void test();

vim test.c

第二個例子:

objs = file1.o file2.o

cc = gcc

cflags = -wall -o -g

helloworld : $(objs)

$(cc) $(objs) -o helloworld

file1.o : file1.c file2.h

$(cc) $(cflags) -c file1.c -o file1.o

file2.o : file2.c file2.h

$(cc) $(cflags) -c file2.c -o file2.o

clean:

rm -rf *.o helloworld

這裡我們應用到了變數。要設定乙個變數,你只要在一行的開始寫下這個變數的名字,後 面跟乙個 = 號,後面跟你要設定的這個變數的值。以後你要引用 這個變數,寫乙個 $ 符號,後面是圍在括號裡的變數名。

cflags = -wall -o –g,解釋一下。這是配置編譯器設定,並把它賦值給cfflags變數。

-wall: 輸出所有的警告資訊。

-o: 在編譯時進行優化。

-g: 表示編譯debug版本。

這樣寫的makefile檔案比較簡單,但很容易就會發現缺點,那就是要列出所有的c檔案。如果你新增乙個c檔案,那就需要修改makefile檔案,這在專案開發中還是比較麻煩的。

linux下的makefile程式設計

程式1 mytool1.c include mytool1.h include stdio.h void mytool1 print char print str 程式2 mytool1.h ifndef mytool 1 h define mytool 1 h void mytool1 print...

Linux下的MakeFile檔案

makefile是linux下的檔案管理工具,本質是檔案,載入執行需要make命令,make命令可以認為是執行shell指令碼檔案 我們建立乙個makefile檔案,注意,在linux中,m首字母大小寫不區分 呼叫vim makefile makefile內容是main的gcc的過程,要分步驟寫,和...

linux 下makefile的使用舉例

該程式在linux平台下用c語言實現 有兩個標頭檔案m1.h m2.h 對應的實現檔案m1.c m2.c 除錯檔案test.c 案例 如下 m1.h includevoid m1 print char str m2.h includevoid m2 print char str m1.c inclu...