編寫乙個簡單通用的makefile

2021-09-21 08:29:54 字數 2796 閱讀 2216

author:李超

date:2012/05/06

縱然makefile

的規則還是相當多的,編寫乙個大規模的軟體,良好的

makefile

架構是方便維護程式編譯的關鍵。學習

makefile

的時間週期還是比較長的,為了寫出規範的**,需要在很短的時間內編寫乙個

makefile

,這裡給給出乙個

makefile

示例。在組織程式的時候可以按照這個示例給出的結構進行,同時還能提高程式的可讀性和合理的目錄結構。

先貼出makefile

的**:

cc = gcc 

cxx = g++ 

clinker = gcc 

cxxlinker = g++ 

defines += 

cflags += 

cxxflags += 

linkflags += 

link = $(cxxlinker) 

incpath += 

libs +=  

objects = main.o 

targets = producer_consumer 

del = rm -rf 

first

:all

.suffixes: .o .c .cpp .cxx .cc .c 

.c.o: 

$(cc) -c $(incpath) $(cxxflags) -o "$@"

"$<"

.cpp.o: 

$(cxx) -c $(incpath) $(cxxflags) -o "$@"

"$<"

.cxx.o: 

$(cxx) -c $(incpath) $(cxxflags) -o "$@"

"$<"

.cc.o: 

$(cxx) -c $(incpath) $(cxxflags) -o "$@"

"$<"

.c.o: 

$(cxx) -c $(incpath) $(cxxflags) -o "$@"

"$<"

all:$(targets) 

$(targets):$(objects) 

$(link) $(linkflags) -o $(targets) $(objects) $(libs) 

clean: 

$(del) $(objects) 

首先,要說明的是這個

makefile

對應的是c和

c++的源程式。對於乙個

makefile

,我們需要定義的關鍵資訊有:

lc編譯器

lc++

編譯器

lc鏈結器 l

c++鏈結器

lc編譯標誌

lc++

編譯標誌

lc鏈結器的標誌

lc++

鏈結器的標誌

l編譯時指定的巨集

l程式中用到的標頭檔案所在的目錄

l程式中引用的庫函式所在的目錄,以及所用到的庫

l生成的可執行檔案的名稱

l生成的可執行檔案所需要的目標檔案

ok,大致就是這些內容。有了這些資訊之後,我們就利用**規則編寫生成目標檔案的命令了。在上面的

makefile

檔案中:

u變數cc表示

c編譯器

u變數cxx表示表示

c++編譯器

u變數clinker表示c

鏈結器 u

變數cxxlinker

表示c++

鏈結器 u

變數defines

表示定義的巨集

u變數cflags

表示編譯

c程式時需要的標誌

u變數cxxflags

表示編譯

c++程式時需要的標誌

u變數linkflags

表示鏈結時用到的標誌

u變數link

用來指定最終鏈結時用到的編譯器

u變數incpath

用來指定標頭檔案所在的路徑(-i)

u變數libs

用來指定用到的庫檔案所在的目錄以及要鏈結的庫(

-l  -l)

u變數objects

用來指定生成可執行檔案所需要的目標檔案

u變數target

用來指定可執行檔案的最終名稱

接下來就要編寫makefile的第乙個規則---入口規則,在makefile中使用 first:all,就是告訴make首先去all這個label處執行命令。

然後再看all這個label,all依賴於$(target),所以make程式回去生成 $(target),所以就順理成章的執行了all下面這條命令:

$(link) $(linkflags) -o $(target) $(objects) $(libs)

由於開始的時候,還沒有生成所需要的目標檔案(objects指定的),所以回去執行那些隱式規則以生成目標檔案。這些隱式規則是由 .suffix這行以及後續的幾行指定的。

.suffix說明了專案中用到的檔案的字尾。然後再接下來幾行中,對每個原始檔的字尾和目標檔案字尾的對映關係安排相應的命令,使之能夠生成相應的目標檔案,最終生成可執行檔案。

至於clean就不多說了。

乙個通用Makefile的編寫

我們在linux環境下開發程式,少不了要自己編寫makefile,乙個稍微大一些的工程下面都會包含很多.c的原始檔。如果我們用gcc去乙個乙個編譯每乙個原始檔的話,效率會低很多,但是如果我們可以寫乙個makefile,那麼只需要執行乙個make就ok了,這樣大大提高了開發效率。但是makefile的...

編寫乙個通用的Makefile檔案

1.1在這之前,我們需要了解程式的編譯過程 a.預處理 檢查語法錯誤,展開巨集,包含標頭檔案等 b.編譯 c s c.彙編 s o 1.2體驗在vc下程式的編譯 a.先編譯,在鏈結 b.修改了哪個檔案,就單獨編譯此檔案,在鏈結 c.修改了哪個標頭檔案,就單獨編譯使用該標頭檔案的原始檔,在鏈結 1.3...

編寫乙個簡單的shell

include include include include include include include include void getloginname void gethostname void getdir p printf s p int main char argv 32 char...