在軟體的工程中的原始檔是不計其數的,其按照型別,功能,模組分別放在若干個目錄中,哪些檔案需要編譯,那些檔案需要後編譯,那些檔案需要重新編譯,甚至進行 更複雜的功能操作,這就引入了我們的系統編譯的工具:
在linux和unix中,有乙個強大的使用程式,叫make,可以用它來管理多模組程式的編譯和鏈結,直至生成可執行檔案
make使用程式讀取乙個說明檔案,稱為makefile,makefile檔案中描述了整個軟體工程的 編譯規則和各個檔案之間的依賴關係;
makefile就像是乙個shell指令碼一樣,其中可以執行作業系統的命令,它帶來的好處就是我們能夠實現「自動化編譯&rdquwww.cppcns.como;,一旦寫好,只要乙個make命令,整個軟體功能就完全自動編譯,極大的提高了軟體開發的效率;
mak程式設計客棧e是乙個命令工具,是乙個解釋makefile中指令的命令工具,一般來說大多數ide都有這個命令
使用make可以是重新編譯的次數達到最小化;
make使用語法:
make [選項][目標][巨集定義]
選項列表:
-d 顯示除錯資訊(debug)
-f檔案》 指定從那個檔案中讀取以來關係,預設檔案是"makefile"或者"makefile","-"表示從標準輸入(file)
-h 顯示所有選項的簡要說明(help)
-n 不執行任何makefile命令,只去現實它們(no)
-s 安靜的方式執行,不顯示任何資訊(silence)
可以使用-h來獲取更多的選項:
當make命令不帶選項執行的時候,它從makefile中讀取指定規則
當制定規則不同與makefile(makefile)的其他檔案中時候,就要執行帶有-f選項的make命令。如make.fray.makefile
make -f make.fray.makefile
makefile的編寫規則一:
目標列表:關聯性列表
命令列表
目標列表:是用乙個或者多個空格分開的目標檔案的清單
關聯性列表:同樣是乙個或者多個空格分開的目標檔案,是目標列表所以來的多個目標檔案的清單;
命令列表:用於建立目標檔案的將要執行的命令清單,這個命令列表被換行符號分開,命令列表中的每個命令必須要以字元開始;
如:##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的編寫規則二:(不建議使用)
目標列表:關聯性列表;命令列表
命令列表是一系列被分號隔開的命令,乙個很長的命令列要續行的時候需要用乙個反斜槓符號
如:all/mymath_test:src/mymath.c程式設計客棧 src/mymath_test.c; \
gcc -o all/mymath_test src/mymath.c \
src/mymath_test.c
注意:makefile書寫主要注意的是:
簡單變數:
定義變數名字:=[文字]
這類變數的實質就是一組字串
新增變數名字+=[文字]或者 變數名字:=[文字][文字]
引用變數
$(變數名)
$單字元變數(指的是但字元的變數 a:=123 $a)
如:g:=gcc 一般我們都是定義成大寫的
$g -o power power.c
內建變數:
$@ 當前目標的名詞
$? 比當前目標更新的已修改的依賴性列表
$< 依賴性列表的第乙個檔案
$^ 用空格分開的所有依賴性列表
虛目標是不存在的檔案
虛目標允許你去強制執行某些事件,但這些事件在正常的規則中是不會發生的
虛目標不是真正的檔案,make命令可以使用針對他們的任意規則
虛目標總是使與之有關的命令被執行
all 生成工程中所有可以執行者,通常是makefile的第乙個生成目標
test 執行程式的自動測試套件
clean 刪除make all生成的所有檔案
install 在系統目錄中安裝工程專案生成的可執行檔案和文件
uninstall 刪除make install安裝的所有檔案
ma程式設計客棧ke中有一些與定義的目標,這些預定義目標被make以一種特殊的方式進行處理,這些目標稱為特殊目標;
.defaults 如果make找不到生成目標的任何makefile入口或字尾規則,就執行與目標相關的命令
.ignore 如果某一行makefile包含該目標,make忽略錯誤**並繼續建立,如果乙個命令不正常存在,make自然會停止,帶有-i選項的make命令可以執行相同的任務
.phony
允許你指定乙個不是檔案的目標,所以您能只是make呼叫一系列makefile中的命令,即使在當前目錄中有乙個具有相同名字的檔案
.silent
make執行這些命令,但是不顯示這些命令,帶有-s的make可以執行相同的人物,
.suffixes
為目標指定的前提(字尾)可以與字尾規則相互關聯,如果與目標沒有相關性的前提,以存在的字尾列表就會被刪除
make中有許多預定義的規則成為字尾規則,它可以讓make自動執行許多任務
為了建立乙個目標,make會遍歷一連串的依賴關係,這是為了決定從何處開始建立,如果沒有找到目標檔案,make就按有限順序查詢原始檔
預設模式規則:
%o:%c
$(cc) $(cflags) -c $<
$o:%s
$(cc) $(aflags) -o $@ $<
#:注釋
\:連線符號
關聯列表和命令列表中可以使用shell萬用字元號? * %等
#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中的預設的模式規則
obj/%.o:src/%.c
$(cc) -o $@ $(cflags) $^
#宣告clean是乙個虛目標
.phony:clean
clean:
rm -rf obj/mymath.o obj/mymath_test.o
本文標題: c語言make和makefile介紹及使用
本文位址: /ruanjian/c/450995.html
Linux下C語言程式設計基礎 Makefile
假設我們有下面這樣的乙個程式,源 如下 main.c include mytool1.h include mytool2.h int main int argc,char argv mytool1.h ifndef mytool 1 h define mytool 1 h void mytool1 ...
yml檔案tab 空格 c語言makefile檔案
toc 在軟體的工程中的原始檔是很多的,其按照型別 功能 模組分別放在若干個目錄和檔案中,哪些檔案需要編譯,那些檔案需要後編譯,那些檔案需要重新編譯,甚至進行更複雜的功能操作,這就有了我們的系統編譯的工具。在linux和unix中,有乙個強大的實用程式,叫make,可以用它來管理多模組程式的編譯和鏈...
go語言的new和make
golang的new和make主要區別如下 effective go舉了乙個例子,見 對於struct的分配和初始化,除了可以使用new外,還可以這樣做 t 例如 func testalloc t testing.t var t1 t t1 new t fmt.println t1 t2 t fmt...