【Linux】makefile的編寫
阿新 • • 發佈:2018-12-06
昨天把程式移植到linux改了bug以後,感覺好麻煩
每次編譯都要輸那麼長一堆命令,容易輸錯,而且沒有變的原始碼也順便重新編譯了一次,很浪費時間。
當時用了別名,發現不能實現需求。
嗯,學一學makefile怎麼寫
基本語法
target : prerequisites
<tab> command
- target:目標檔案/執行檔案/標籤
- prerequisites:生成target需要的依賴
- command:需要執行的命令
依賴關係說明了目標檔案是由哪些檔案生成的,換句話說,如果後面被依賴的檔案更新了,則目標檔案需要重新生成。
如果prerequisites的日期比target新,或者target不存在,就執行command
command行的開頭必須是<tab>
。
示例
用自己的專案做示例吧
我的專案裡面的標頭檔案包括
- leptException.h
- leptParser.h
- leptValue.h
原始檔包括
- leptParser.cpp
- leptValue.cpp
- test.cpp
依賴關係如下:
- leptValue.cpp包含了原始檔leptValue.h和leptParser.h
- leptParser.cpp包含了leptParser.h和leptException.h
- test.cpp包含了所有標頭檔案
OBJS = test.o leptParser.o leptValue.o
g11 = g++ -std=c++11 -g -Wall
main : ${OBJS}
g++ -std=c++11 -g -Wall -o main ${OBJS} /usr/local/lib/libgtest.a -lpthread
test.o : test.cpp leptValue.h leptParser.h leptException.h
${g11} -c test.cpp
leptParser.o : leptParser.cpp leptParser.h leptException.h
${g11} -c leptParser.cpp
leptValue.o : leptValue.cpp leptValue.h leptParser.h
${g11} -c leptValue.cpp
.PHONY: clean
clean :
-rm main ${OBJS}
上面的工作過程:
- make在當前路徑下找makefile檔案
- 尋找檔案中第一個target,作為最終的目標檔案
- 如果main不存在,或者依賴更新,則生成main
- 如果依賴的也不存在,比如test.o,則去找目標test.o,並根據command去生成
clean後面沒有依賴,所以不會自動執行。
變數
前兩行的是變數,省得要不停的寫一串東西
定義方式就是xxx=...
。
引用方式是${xxx}
或者$(xxx)
自動推導
make的自動推導好像不太好用,因為我自己還加了一堆引數,推導不出來,這裡就不介紹了,這篇文章裡寫了。makefile介紹
清空檔案
如果當前資料夾下有一個檔案叫clean,則後面的command是不會執行的,因為clean已經存在,而且沒有依賴。
宣告為偽目標後,make就不會檢查而是每次都執行了
為了忽略命令的出錯,我們可以在Makefile的命令列前加一個減號 - (在Tab鍵之後) ,標記為不管命令出不出錯都認為是成功的,這樣命令會繼續執行下去