author:李超
date:2012/05/06
縱然makefile
的規則還是相當多的,編寫乙個大規模的軟體,良好的
makefile
架構是方便維護程式編譯的關鍵。學習
makefile
的時間週期還是比較長的,為了寫出規範的**,需要在很短的時間內編寫乙個
makefile
,這裡給給出乙個
makefile
示例。在組織程式的時候可以按照這個示例給出的結構進行,同時還能提高程式的可讀性和合理的目錄結構。
先貼出makefile
的**:
cc = gcccxx = 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...