make與Makefile
多個文件編譯,須要提供一個makefile文件用它來一層層的自動化編譯目標文件html
makefile
- 整個的編寫流程應該以下:
all:main
main(目標文件): x.o b.o(依賴文件)
(TAB)gcc -o main x.o b.o(命令)
x.o: x.c
(TAB)gcc -c x.c
b.o: b.c
(TAB)gcc -c b.c
...
...
- 另外若是存在一行寫不完須要中途換行的狀況下,那就須要使用 / 進行換行
例如說:
main: a.o b.o c.o d.o e.o /
f.o h.o i.o
- 除了all以外,makefile一樣能夠指定目標,即以下:
clean:
rm -f *.o
這是咱們經常使用的一種目標方式,當工做目錄沒有clean這個文件時候,make clean就會執行刪除命令
- 那麼若是咱們須要在即便是有clean文件的狀況下依然執行make clean,則咱們須要加入僞目標,將clean聲明爲僞目標以後,不論存不存在clean文件,都能正常的是執行刪除,語法以下:
.PHONY:clean
clean:
rm -f *.o
- 若是想爲Makefile提供輸出提示,那麼能夠:
@echo 正在編譯xxxx模塊
若是不加@那麼echo會被顯示,就相似於Windows批處理的輸出,@意思是隱藏回顯
- 若是想要Make去執行多個腳本命令,那麼須要在命令之間以分號隔開:
test:
cd ./test/; pwd
- 若是須要忽略makefile中的錯誤命令信息,那麼能夠在相關命令上加入‘-’或者指定make的-i參數
make -i
或者
test:
-cd ./test/
- makefile一樣能夠加入條件語句
ifeq($1, $2)
else
endif
或者
(if <condition>,<then-part>)
(if <condition>,<then-part>,<else-part>)
- makefile能夠加入路徑的設置 VPATH
VPATH <directories> :: 當前目錄中找不到文件時, 就從<directories>中搜索
VPATH <pattern> <directories> :: 符合<pattern>格式的文件, 就從<directories>中搜索
VPATH <pattern> :: 清除符合<pattern>格式的文件搜索路徑
VPATH :: 清除全部已經設置好的文件路徑
- makefile中的定義變量和使用
variable = %.h
all: $(variable)
Make的運行
-
那麼當咱們執行make時候,make的運行過程是怎麼樣的呢?
- make在當前目錄下依次搜索下面3個文件 "GNUmakefile", "makefile", "Makefile"(推薦使用Makefile)
- 以第一個目標文件爲終極目標,開始進行推導,若是說沒有這個文件,或者目標依賴文件改動時間比目標文件生成時間新,那麼就會對相關項進行新的生成;
- 若是依賴文件也不存在,那麼make會查找makefile文件中以缺失的依賴文件爲目標的相關項進行生成
-
查看文件的依賴關係,gcc 所使用的命令,能夠查看後直接放入makefile做爲目標用
gcc -MM kvm_main.c多線程
-
make能夠增長的參數
--debug[=<options>] 輸出make的調試信息, options 能夠是 a, b, v
-j --jos 同時運行的命令的個數, 也就是多線程執行 Makefile
-r --no-builtin-rules 禁止使用任何隱含規則
-R --no-builtin-variabes 禁止使用任何做用於變量上的隱含規則
-B --always-make 假設全部目標都有更新, 即強制重編譯
-i --ignore-error 忽略命令的錯誤返回
-
命令變量
RM rm -f
AR ar
CC cc
CXX g++
-
約定俗稱的僞目標
all 全部目標的目標,其功能通常是編譯全部的目標
clean 刪除全部被make建立的文件
install 安裝已編譯好的程序,其實就是把目標可執行文件拷貝到指定的目錄中去
print 列出改變過的源文件
tar 把源程序打包備份. 也就是一個tar文件
dist 建立一個壓縮文件, 通常是把tar文件壓成Z文件. 或是gz文件
TAGS 更新全部的目標, 以備完整地重編譯使用
check 或 test 通常用來測試makefile的流程
資料參考:
https://www.cnblogs.com/mfryf...
https://www.cnblogs.com/wang_...測試