C語言make和Makefile介紹及使用
1:make和Makefile的介紹:
概念
在軟件的工程中的源文件是不計(jì)其數(shù)的,其按照類型,功能,模塊分別放在若干個(gè)目錄中,哪些文件需要編譯,那些文件需要后編譯,那些文件需要重新編譯,甚至進(jìn)行 更復(fù)雜的功能操作,這就引入了我們的系統(tǒng)編譯的工具:
在linux和unix中,有一個(gè)強(qiáng)大的使用程序,叫make,可以用它來管理多模塊程序的編譯和鏈接,直至生成可執(zhí)行文件
make使用程序讀取一個(gè)說明文件,稱為Makefile,Makefile文件中描述了整個(gè)軟件工程的 編譯規(guī)則和各個(gè)文件之間的依賴關(guān)系;
Makefile就像是一個(gè)Shell腳本一樣,其中可以執(zhí)行操作系統(tǒng)的命令,它帶來的好處就是我們能夠?qū)崿F(xiàn)“自動(dòng)化編譯”,一旦寫好,只要一個(gè)make命令,整個(gè)軟件功能就完全自動(dòng)編譯,極大的提高了軟件開發(fā)的效率;
make是一個(gè)命令工具,是一個(gè)解釋Makefile中指令的命令工具,一般來說大多數(shù)IDE都有這個(gè)命令
使用make可以是重新編譯的次數(shù)達(dá)到最小化;
2:make和Makefile
1:make的使用語法:
make使用語法: ? ? make [選項(xiàng)][目標(biāo)][宏定義] ? ? 選項(xiàng)列表: ? ? ? ? -d ?顯示調(diào)試信息(debug) ? ? ? ? -f<文件> 指定從那個(gè)文件中讀取以來關(guān)系,默認(rèn)文件是"Makefile"或者"makefile","-"表示從標(biāo)準(zhǔn)輸入(file) ? ? ? ? -h ?顯示所有選項(xiàng)的簡要說明(help) ? ? ? ? -n 不運(yùn)行任何Makefile命令,只去現(xiàn)實(shí)它們(no) ? ? ? ? -s 安靜的方式運(yùn)行,不顯示任何信息(silence) ? ? 可以使用-h來獲取更多的選項(xiàng):
2:Makefile的編寫原則和規(guī)則
當(dāng)make命令不帶選項(xiàng)運(yùn)行的時(shí)候,它從Makefile中讀取指定規(guī)則 當(dāng)制定規(guī)則不同與Makefile(makefile)的其他文件中時(shí)候,就要運(yùn)行帶有-f選項(xiàng)的make命令。如make.fray.Makefile make -f make.fray.Makefile
Makefile的編寫規(guī)則一:
目標(biāo)列表:關(guān)聯(lián)性列表
<TAB>命令列表
目標(biāo)列表:是用一個(gè)或者多個(gè)空格分開的目標(biāo)文件的清單
關(guān)聯(lián)性列表:同樣是一個(gè)或者多個(gè)空格分開的目標(biāo)文件,是目標(biāo)列表所以來的多個(gè)目標(biāo)文件的清單;
命令列表:用于創(chuàng)建目標(biāo)文件的將要執(zhí)行的命令清單,這個(gè)命令列表被換行符號(hào)分開,命令列表中的每個(gè)命令必須要以<TAB>字符開始;
如:##Sample
power:power.c
gcc -o power power.c
如:#Sample
power:power.o demo.o
gcc -o power power.o demo.o
power.o:power.c
gcc -o power.o -c power.c
demo.o:demo.c
gcc -o demo.o -c demo.c
注意:書寫的形式類似于倒推的形式Makefile的編寫規(guī)則二:(不建議使用)
目標(biāo)列表:關(guān)聯(lián)性列表;命令列表 命令列表是一系列被分號(hào)隔開的命令,一個(gè)很長的命令行要續(xù)行的時(shí)候需要用一個(gè)反斜杠符號(hào) 如:all/mymath_test:src/mymath.c src/mymath_test.c; \ gcc -o all/mymath_test src/mymath.c \ src/mymath_test.c
注意:makefile書寫主要注意的是:
- 1:編譯規(guī)則
- 2:依賴關(guān)系
- 3:倒推原理
- 4:使用make命令去執(zhí)行
- 5:如果已經(jīng)是最新的文件的時(shí)候,就不會(huì)再去編譯執(zhí)行了
- 6:make去讀取makefile的時(shí)候,是按照依賴文件的順序去查找并且執(zhí)行命令的
- 7:make在編譯的時(shí)候,如果發(fā)現(xiàn)被編譯的文件已經(jīng)是最新的了,就不會(huì)再去編譯(減少了編譯次數(shù))
- 8:make文件是根據(jù)被編譯文件的時(shí)間戳去判斷文件是否是當(dāng)前最新的文件,如果是最新的,那么就會(huì)去重新編譯,如果不是最新的,就不會(huì)去進(jìn)行編譯;
- 9:千萬要注意makefile中編譯命令前面的分隔符
Makefile變量的使用
簡單變量:
定義
變量名字:=[文本]
這類變量的實(shí)質(zhì)就是一組字符串
添加
變量名字+=[文本]或者 變量名字:=[文本][文本]
引用變量
$(變量名)
$單字符變量(指的是但字符的變量 a:=123 $a)
如:G:=gcc 一般我們都是定義成大寫的
$G -o power power.c
內(nèi)置變量:
$@ 當(dāng)前目標(biāo)的名詞
$? 比當(dāng)前目標(biāo)更新的已修改的依賴性列表
$< 依賴性列表的第一個(gè)文件
$^ 用空格分開的所有依賴性列表虛目標(biāo)
虛目標(biāo)是不存在的文件
虛目標(biāo)允許你去強(qiáng)制執(zhí)行某些事件,但這些事件在正常的規(guī)則中是不會(huì)發(fā)生的
虛目標(biāo)不是真正的文件,make命令可以使用針對(duì)他們的任意規(guī)則
虛目標(biāo)總是使與之有關(guān)的命令被執(zhí)行
all 生成工程中所有可以執(zhí)行者,通常是makefile的第一個(gè)生成目標(biāo)
test 運(yùn)行程序的自動(dòng)測試套件
clean 刪除make all生成的所有文件
install 在系統(tǒng)目錄中安裝工程項(xiàng)目生成的可執(zhí)行文件和文檔
uninstall 刪除make install安裝的所有文件特殊目標(biāo)
make中有一些與定義的目標(biāo),這些預(yù)定義目標(biāo)被make以一種特殊的方式進(jìn)行處理,這些目標(biāo)稱為特殊目標(biāo);
.DEFAULTS 如果make找不到生成目標(biāo)的任何makefile入口或后綴規(guī)則,就執(zhí)行與目標(biāo)相關(guān)的命令
.IGNORE 如果某一行makefile包含該目標(biāo),make忽略錯(cuò)誤代碼并繼續(xù)建立,如果一個(gè)命令不正常存在,make自然會(huì)停止,帶有-i選項(xiàng)的make命令可以執(zhí)行相同的任務(wù)
.PHONY
允許你指定一個(gè)不是文件的目標(biāo),所以您能只是make調(diào)用一系列makefile中的命令,即使在當(dāng)前目錄中有一個(gè)具有相同名字的文件
.SILENT
make執(zhí)行這些命令,但是不顯示這些命令,帶有-s的make可以執(zhí)行相同的人物,
.SUFFIXES
為目標(biāo)指定的前提(后綴)可以與后綴規(guī)則相互關(guān)聯(lián),如果與目標(biāo)沒有相關(guān)性的前提,以存在的后綴列表就會(huì)被刪除默認(rèn)模式規(guī)則
make中有許多預(yù)定義的規(guī)則成為后綴規(guī)則,它可以讓make自動(dòng)執(zhí)行許多任務(wù)
為了建立一個(gè)目標(biāo),make會(huì)遍歷一連串的依賴關(guān)系,這是為了決定從何處開始建立,如果沒有找到目標(biāo)文件,make就按有限順序查找源文件
默認(rèn)模式規(guī)則:
%o:%c
$(CC) $(CFLAGS) -c $<
$o:%s
$(CC) $(AFLAGS) -o $@ $<Makefile中的相關(guān)通配符:
#:注釋 \:連接符號(hào) 關(guān)聯(lián)列表和命令列表中可以使用shell通配符號(hào)? * %等
附上一個(gè)簡單的makefile
#Sample
CC:=gcc
CFLAGS:=-Iinclude
CFLAGS+=-c
TARGET:=all/mytest_test3
DEPEND:=obj/mymath.o
DEPEND+=obj/mymath_test.o
$(TARGET):$(DEPEND)
$(CC) -o $@ $^
#obj/mymath.o:src/mymath.c
# $(CC) -o $@ $(CFLAGS) $^
#obj/mymath_test.o:src/mymath_test.c
# $(CC) -o $@ $(CFLAGS) $^
#使用make中的默認(rèn)的模式規(guī)則
obj/%.o:src/%.c
$(CC) -o $@ $(CFLAGS) $^
#聲明clean是一個(gè)虛目標(biāo)
.PHONY:clean
clean:
rm -rf obj/mymath.o obj/mymath_test.o到此這篇關(guān)于C語言make和Makefile介紹及使用的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
探討:程序在內(nèi)存中的分配(常量,局部變量,全局變量,程序代碼)問題
本篇文章是對(duì)程序在的內(nèi)存中分配(常量,局部變量,全局變量,程序代碼)的問題進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
基于C語言實(shí)現(xiàn)學(xué)生管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了基于C語言實(shí)現(xiàn)學(xué)生管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
C++實(shí)現(xiàn)字符串和整數(shù)的相互轉(zhuǎn)換
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)字符串和整數(shù)的相互轉(zhuǎn)換的方法,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C++有一定的幫助,需要的可以參考一下2023-01-01

