通用Makefile詳解

2021-07-27 07:22:45 字數 1669 閱讀 7412

我們在linux環境下開發程式,少不了要自己編寫makefile,乙個稍微大一些的工程下面都會包含很多。c的源文 件。

如果我們用gcc去乙個乙個編譯每乙個原始檔的話,效率會低很多,但是如果我們可以寫乙個makefile,那麼只需要執行乙個make就ok了,這 樣大大提高了開發效率。

但是makefile的語法規則眾多,而且缺乏參考資料,對於初學者來說,寫起來還是有一定的難度,往往令很多人望而生畏。

下面我 們介紹乙個比較通用而且簡潔的makefile,大家只要對它稍作修改就可以用在你們自己的工程裡了。

main.o : main.c

gcc –c main.c

clean :

這是乙個傻瓜式的makefile,不靈活,而且不具備可複製性,想象乙個如果我們的工程下面有50個原始檔,那豈不是要乙個乙個寫出來。

我們的目標是寫乙個makefile,只要稍作修改就可以在各個工程之間通用。

下面這個makefile就可以滿足這個要求:

srcs = $(wildcard *.c)

#objs = main.o 等其他的目標檔案

#srcs = $(objs :.o = .c)

objs = $(srcs:.c = .o)

cc = gcc

includes = -i/×××

libs = -l/×××

ccflags = -g -wall -o0

$(cc) $^ -o $@ $(includes) $(libs) $(ccflags)

%.o : %.c

$(cc) -c $< 

clean:

rm *.o

.phony:clean

實際上編寫 makefile就是為了提高我們的工作效率,而不是增加我們的工作量。

因此makefile為我們提供了很多強大的功能,比如定義變數,使用萬用字元等 等。只要合理利用,就可以達到事半功倍的效果。

下面我們一條一條分析這個makefile:

srcs = $(wildcard *.c)

這條語句定義了乙個變數srcs,它的值就是當前面目錄下面所有的以。c結尾的原始檔。

objs = $(srcs:.c = .o)

這裡變數objs的值就是將srcs裡面所有。c檔案編譯出的。o目標檔案

cc = gcc

變數cc代表我們要使用的編譯器

includes = -i/×××

libs = -l/×××

這裡指定除了編譯器預設的標頭檔案和庫檔案的路徑之外需要額外引用的標頭檔案路徑以及庫的路徑(×××表示路徑)。

ccflags = -g -wall -o0

ccflags變數存放的是編譯選項

$(cc) $^ -o $@ $(includes) $(libs)

%.o : %.c

$(cc) -c $< $(ccflags)

將所有的。c源**編譯成。o目標檔案,這樣寫是不是很省事?

clean:

rm *.o

在執行make clean之後刪除所有編譯過程中生成的。o檔案。

.phony:clean

每次執行make clean時都要執行rm *.o命令

這個makefile就具備靈活的通用性,我們只要對它稍作修改就可以用在自己的工程裡面。當然makefile還有很多強大的功能,需要我們進一步學習。

乙個通用的makefile詳解

一般整個工程的makefile分為3類 1.頂層目錄的makefile 2.頂層目錄的makefile.build 3.各級子目錄的makefile 1 頂層目錄的makefile 它除了定義obj y來指定根目錄下要編程序式去的檔案 子目錄外,主要是定義工具鏈 編譯引數 鏈結引數 就是檔案中用ex...

驅動通用Makefile分析

先看makefile 這種需要在核心的makefile中新增arch 和 cross compile ubuntu的核心原始碼樹,如果要編譯在ubuntu中安裝的模組就開啟這2個 ubuntu的核心原始碼樹,如果要編譯在ubuntu中安裝的模組就開啟這2個 kern ver 3.13.0 32 ge...

linux 通用makefile編寫

一般當我們的工程檔案較多的時候,使用gcc工具直接敲編譯命令比較麻煩,所以寫makefile的好處就來了,每次只需要敲一下make就能編譯 這裡分享乙個萬能版的,當前目錄不管多少檔案,都只需要make一下,不用修改makefile,直接生成main可執行程式 以下是makefile 交叉編譯工具鏈 ...