makefile編寫方法

2021-07-13 19:13:41 字數 3485 閱讀 5820

什麼是makefile?或許很多winodws的程式設計師都不知道這個東西,因為那些windows的ide都

為你做了這個工作,但我覺得要作乙個好的和 professional的程式設計師,makefile還是要懂

。這就好像現在有這麼多的html的編輯器,但如果你想成為乙個專業人士,你還是要了解

html的標識的含義。特別在unix下的軟體編譯,你就不能不自己寫makefile了,會不會寫

makefile,從乙個側面說明了乙個人是否具備完成大型工程的能力。

因為,makefile關係到了整個工程的編譯規則。乙個工程中的原始檔不計數,其按型別、

功能、模組分別放在若干個目錄中,makefile定義了一系列的規則來指定,哪些檔案需要

先編譯,哪些檔案需要後編譯,哪些檔案需要重新編譯,甚至於進行更複雜的功能操作,

因為 makefile就像乙個shell指令碼一樣,其中也可以執行作業系統的命令。

makefile帶來的好處就是——「自動化編譯」,一旦寫好,只需要乙個make命令,整個工

程完全自動編譯,極大的提高了軟體開發的效率。make是乙個命令工具,是乙個解釋make

file中指令的命令工具,一般來說,大多數的ide都有這個命令,比如:delphi的make,v

isual c++的nmake,linux下gnu的make。可見,makefile都成為了一種在工程方面的編譯

方法。現在講述如何寫 makefile的文章比較少,這是我想寫這篇文章的原因。當然,不同廠商的

make各不相同,也有不同的語法,但其本質都是在「檔案依賴性」上做文章,這裡,我僅

對gnu的make進行講述,我的環境是redhat linux 8.0,make的版本是3.80。必竟,這個m

ake是應用最為廣泛的,也是用得最多的。而且其還是最遵循於ieee 1003.2-1992 標準的

(posix.2)。

在這篇文件中,將以c/c++的原始碼作為我們基礎,所以必然涉及一些關於c/c++的編譯的知

識,相關於這方面的內容,還請各位檢視相關的編譯器的文件。這裡所預設的編譯器是un

ix下的gcc和cc。

關於程式的編譯和鏈結

——————————

在此,我想多說關於程式編譯的一些規範和方法,一般來說,無論是c、c++、還是pas,首

先要把原始檔編譯成中間**檔案,在windows下也就是 .obj 檔案,unix下是 .o 檔案,

即 object file,這個動作叫做編譯(compile)。然後再把大量的object file合成執行

檔案,這個動作叫作鏈結(link)。

編譯時,編譯器需要的是語法的正確,函式與變數的宣告的正確。對於後者,通常是你需

要告訴編譯器標頭檔案的所在位置(標頭檔案中應該只是宣告,而定義應該放在c/c++檔案中)

,只要所有的語法正確,編譯器就可以編譯出中間目標檔案。一般來說,每個原始檔都應

該對應於乙個中間目標檔案(o檔案或是obj檔案)。

鏈結時,主要是鏈結函式和全域性變數,所以,我們可以使用這些中間目標檔案(o檔案或是

obj檔案)來鏈結我們的應用程式。鏈結器並不管函式所在的原始檔,只管函式的中間目標

檔案(object file),在大多數時候,由於原始檔太多,編譯生成的中間目標檔案太多,

而在鏈結時需要明顯地指出中間目標檔名,這對於編譯很不方便,所以,我們要給中間

目標檔案打個包,在windows下這種包叫「庫檔案」(library file),也就是 .lib 檔案

,在unix下,是archive file,也就是 .a 檔案。

總結一下,原始檔首先會生成中間目標檔案,再由中間目標檔案生成執行檔案。在編譯時

,編譯器只檢測程式語法,和函式、變數是否被宣告。如果函式未被宣告,編譯器會給出

乙個警告,但可以生成object file。而在鏈結程式時,鏈結器會在所有的object file中

找尋函式的實現,如果找不到,那到就會報鏈結錯誤碼(linker error),在vc下,這種

錯誤一般是:link 2001錯誤,意思說是說,鏈結器未能找到函式的實現。你需要指定函式

的object file.

好,言歸正傳,gnu的make有許多的內容,閒言少敘,還是讓我們開始吧。

makefile 介紹

———————

make命令執行時,需要乙個 makefile 檔案,以告訴make命令需要怎麼樣的去編譯和鏈結

程式。首先,我們用乙個示例來說明makefile的書寫規則。以便給大家乙個感興認識。這個示例

**於gnu的make使用手冊,在這個示例中,我們的工程有8個c檔案,和3個頭檔案,我們

要寫乙個makefile來告訴make命令如何編譯和鏈結這幾個檔案。我們的規則是:

1)如果這個工程沒有編譯過,那麼我們的所有

c檔案都要編譯並被鏈結。

2)如果這個工程的某幾個

c檔案被修改,那麼我們只編譯被修改的

c檔案,並鏈結目標程式。3

)如果這個工程的標頭檔案被改變了,那麼我們需要編譯引用了這個標頭檔案的所有

c檔案,並

鏈結目標程式。

只要我們的makefile寫得夠好,所有的這一切,我們只用乙個make命令就可以完成,make

命令會自動智慧型地根據當前的檔案修改的情況來確定哪些檔案需要重編譯,從而自己編譯

所需要的檔案和鏈結目標程式。

一、makefile的規則

在講述這個makefile之前,還是讓我們先來粗略地看一看makefile的規則。

target ... : prerequisites ...

command

......

target也就是乙個目標檔案,可以是object file,也可以是執行檔案。還可以是乙個標籤

(label),對於標籤這種特性,在後續的「偽目標」章節中會有敘述。

prerequisites就是,要生成那個target所需要的檔案或是目標。

command也就是make需要執行的命令。(任意的shell命令)

這是乙個檔案的依賴關係,也就是說,target

這乙個或多個的目標檔案依賴於

prerequisi

tes中的檔案,其生成規則定義在

command

中。說白一點就是說,

prerequisites

中如果有一

個以上的檔案比

target

檔案要新的話,

command

所定義的命令就會被執行。這就是

makefi

le的規則。也就是

makefile

中最核心的內容。

。第二位是:roland mcgrath

個人主頁是:

,下面是他的一些事蹟:

1) 合作編寫了並維護gnu make。

2) 和thomas bushnell一同編寫了gnu hurd。

3) 編寫並維護著gnu c library。

4) 合作編寫並維護著部分的gnu emacs。

在此,向這兩位開源專案的鬥士致以最真切的敬意。

makefile簡說 編寫makefile

linux下原始碼編譯 linux下原始碼編譯c c 通常使用gnu工具鏈。c c 的編譯過程,通常為原始檔 c cc cpp字尾檔案 編譯為中間目標檔案 即生成為.s o等字尾的中間檔案 再通過鏈結生成可執行檔案 編譯器的編譯過程大致分為四個步驟 預處理 編譯 彙編和鏈結 建立乙個專案檔案proj...

makefile編寫說明

1.定義 makefile是通過制定規則來編譯程式的乙個指令碼而已。在linux中使用make命令來執行makefile檔案。2.命名 makefile或makefile,若是指定其他名稱。如 makefile.可以這樣使用make f makefile或make clean f makefile ...

makefile檔案編寫

hello.c include include function.h int main function.c includeint fun1 int fun2 int fun3 function.h ifndef fun h define fun h int fun1 void int fun2 v...