1. 程式人生 > >【Linux】makefile的編寫

【Linux】makefile的編寫

昨天把程式移植到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鍵之後) ,標記為不管命令出不出錯都認為是成功的,這樣命令會繼續執行下去