C語言make和Makefile介紹及使用

2022-09-21 08:21:10 字數 3629 閱讀 3094

在軟體的工程中的原始檔是不計其數的,其按照型別,功能,模組分別放在若干個目錄中,哪些檔案需要編譯,那些檔案需要後編譯,那些檔案需要重新編譯,甚至進行 更複雜的功能操作,這就引入了我們的系統編譯的工具:

在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...