1.makefile介紹
在linux中使用make命令來編譯程式,特別是大程式;而make命令所執行的動作依賴於makefile檔案。最簡單的makefile檔案如下:
hello:hello.c
gcc -o hello hello.c //以tab鍵縮排
clean:
rm -f hello //以tab鍵縮排
當乙個資料夾中有hello.c、makefile檔案時,在linux終端中輸入make命令時就可以編譯程式,執行make clean即可清除編譯出來的結果。make命令根據檔案更新的時間戳來決定哪些檔案需要重新編譯,這樣可以避免編譯已經編譯過的、沒有變化的程式,提高了編譯效率,這對大型工程特別有利。
2.makefile規則
乙個簡單的makefile檔案包含一系列的規則,如下所示:
目標(target)...:依賴(prerequiries)
命令(command)
目標(target)通常是要生成檔案的名稱,可以是可執行檔案或obj檔案,如上述的hello就是目標,屬於可執行檔案,
也;可以是執行的動作名稱,如上述的clean。
依賴是用來產生目標的材料,如上述的hello.c,屬於原始檔。
命令是生成目標時所執行的動作,每個命令佔一行,如上述的gcc -o hello hello.c和rm -f hello都是命令。
3.makefile檔案中變數的賦值方法
在gnu make中對變數的賦值方法有兩種方式,分別為延時變數、立即變數。
3.1延時變數
延時變數在使用時才展開,即真正使用的時候這個變數的值才確定使用=、?=、或define指令定義。其中?=用來定義第一次出現的延時變數。語法形式如下:
var(變數)=val(值)
var(變數)?=val(值)
define var(變數)
3.2立即變數
立即變數的值在定義的時候就已經確定,語法形式如下:
var(變數):=val(值)
4.makefile中的函式呼叫格式
makefile中的函式呼叫格式如下:
$(function
arguments)
這裡function是函式名,arguments是該函式的引數。引數與函式名之間用空格或tab隔開,如果有多個引數,用逗號隔開。這些空格和逗號不是引數值的一部分。
5.makefile檔案示例
此目下包含以下檔案:main.c、makefile、sub.c、sub.h。makefile的**如下:
//file:makefile
01 src := $(shell ls
*.c)
02 objs := $(patsubst %.c,%.o,$(src))
0304 test: $(objs)
05 gcc -o $@
$^06
07%.o:%.c
08 gcc -c -o $@
$<
0910 clean:
11 rm -f test *.o
上述makefile中$@
、$^
、$<
稱為自動變數。$@
表示規則的目標檔名;$^
表示所有依賴的名字,名字之間用空格隔開;$<
表示第乙個依賴的檔名。%
為萬用字元,它和乙個字串中任意個數的字元相匹配。
第一行中src
的值為main.c sub.c
。$(shell ls *.c)
是makefile中的函式,是查詢當前目錄下字尾為.c
的檔案,*
為萬用字元。
第二行中objs
變數的值為main.o sub.o
,是src
變數經過patsubst
函式處理後得到的。
patsubst為makefile中的函式,為模式字串替換函式。格式如下:
$(patsubst pattern,replacement,text)
尋找text中符合格式pattern的字,用replacement替換它們。比如:
$(patsubst %.c,%.o,x
.c.c bar.c)
結果為:
x
.c.o bar.o
第四行實際上就是:
test:main.o
sub.o
目標test的依賴為main.o和sub.o。開始時這兩個檔案還沒生成,在執行生成test的命令之前,先將main.o、sub.o作為目標查詢合適的規則,以生產main.o、sub.o。
第
七、八行就是用來生成main.o、sub.o的規則。
main.o的規則如下:
main:main.c
gcc -c -o main.o main.c
sub.o的規則如下:
sub:sub
.c gcc -c -o sub
.osub
.c
這樣,test的依賴main.o和sub.o就生成了。
在終端中輸入make時,會看到如下資訊:
gcc -c -o main.o main.c
gcc -c -o sub
.osub
.cgcc -o test main.o
sub.o
其中test為可執行檔案,在終端中輸入make clean,則可清除編譯生成的檔案。 Linux中Makefile的使用
我也是初學linux,對linux中的編譯產生的一定的厭煩,正巧遇到了makefile。一 makefile的引入 我們現在已有main.c,mymath.c,mymath.h三個檔案,想要此程式能正常執行就需要輸入以下命令進行編譯連線。但是當檔案多了之後就可能需要多個檔名,會產生極大的麻煩。有了m...
linux中的makefile使用
在 linux unix 環境下使用gnu 的make工具能夠比較容易的構建乙個屬於你自己的工程,整個工程的編譯只需要乙個命令就可以完成編譯 連線以至於最後的執行。不過這需要我們投入一些時間去完成乙個或者多個稱之為makefile 檔案的編寫。所寫的makefile 檔案描述了整個工程的編譯 連線等...
關於Linux中Makefile 檔案的使用
大學有陣子做嵌入式的時候覺得makefile簡直高不可攀 教程大多數都在試圖把許多細節都講清楚 沒有跟教程死磕3天的勁頭真的不容易搞懂makefile 而且寫makefile需要一點點gcc編譯器的儲備知識。對於在linux上剛上手的開發者的確有點繞。所以我在這裡做了個最簡版的makefile,看懂...