Makefile 規(guī)則

一 :文件目錄

| --func1 
|    |--func1.cpp
|    |--func1.h
| -- func2
|    |--func2.cpp
|    |--func2.h
| -- main.cpp
| -- makefile

二: 編譯要求

a> 如果工程所有文件都沒(méi)有編譯過(guò),則所有的都需要編譯,并鏈接
b> 如果部分文件被修改,則編譯部分文件 并鏈接目標(biāo)
c> 如果頭文件被修改 只需要編譯引用頭文件的文件并鏈接

三 : 基本格式

target: dependent_file_list
  command1

second_target: dependent_file_list
  command2

third_target: dependent_file_list
  command3

target: 最終生成的目標(biāo)文件 ,
dependent file list: 生成目標(biāo)文件需要的依賴的文件
command: 對(duì)依賴文件操作生成最終文件的命令

四 :實(shí)現(xiàn)

1: 基本實(shí)現(xiàn)

demo: main.o func1.o func2.o
    g++ -o demo main.o func1.o func2.o

main.o: main.cpp .\func1\func1.h .\func2\func2.h
    g++ -c main.cpp -o main.o

func1.o: .\func1\func1.cpp .\func1\func1.h
    g++ -c .\\func1\\func1.cpp -o func1.o

func2.o: .\func2\func2.cpp .\func2\func2.h
    g++ -c .\\func2\\func2.cpp -o func2.o

clean:
    del demo.exe|del func1.o|del main.o|del func2.o

2:使用變量

在增加新文件時(shí)可減少重復(fù)編寫重復(fù)代碼

objects = main.o func1.o func2.o

demo: $(objects)
    g++ -o demo $(objects)

main.o: main.cpp .\func1\func1.h .\func2\func2.h
    g++ -c main.cpp -o main.o

func1.o: .\func1\func1.cpp .\func1\func1.h
    g++ -c .\\func1\\func1.cpp -o func1.o

func2.o: .\func2\func2.cpp .\func2\func2.h
    g++ -c .\\func2\\func2.cpp -o func2.o

clean:
    del demo.exe|del func1.o|del main.o|del func2.o

3:自動(dòng)推導(dǎo)

針對(duì) ".o" 文件,make 可自動(dòng)將 ".c"文件加入依賴關(guān)系

objects = main.o func1.o func2.o

demo: $(objects)
    g++ -o demo $(objects)

main.o: .\func1\func1.h .\func2\func2.h
#   g++ -c main.cpp -o main.o

func1.o: .\func1\func1.cpp .\func1\func1.h
    g++ -c .\\func1\\func1.cpp -o func1.o

func2.o: .\func2\func2.cpp .\func2\func2.h
    g++ -c .\\func2\\func2.cpp -o func2.o

clean:
    del demo.exe|del func1.o|del main.o|del func2.o

五 make語(yǔ)法

make支持shell命令

 ”  *  “   匹配0個(gè)或者任意個(gè)字符
 ”  ?“   匹配任意一個(gè)字符
 ”  []  “   匹配制定的字符
 ”  [-] “   匹配制定的字符
 ”  [^] “   匹配制定的字符

注:在依賴關(guān)系中不能引用變量

變量的基本賦值

簡(jiǎn)單賦值( := ) ——常規(guī)賦值語(yǔ)句,只對(duì)當(dāng)前語(yǔ)句的變量有效。

遞歸賦值( = )——賦值語(yǔ)句可能影響多個(gè)變量,目標(biāo)改變后,其他變量都受影響

條件賦值( ?= )——如果變量未定義,則使用符號(hào)中值定義變量, 如已賦值,則該賦值語(yǔ)句無(wú)效

追加賦值( += )——原變量用空格隔開的方式追加一個(gè)新值

make 的基本變量

【 $@ 】 表示規(guī)則的目標(biāo)文件名

【 $^ 】 表示規(guī)則中的依賴文件列表

【 $< 】 表示規(guī)則中第一個(gè)依賴文件

make 的Path變量

一般搜索VPATH
可理解為win的環(huán)境變量,以冒號(hào)或者空格隔開

選擇搜索vpath
vpath test.c src : car

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容