實例學習寫Makefile文件

目錄程序員

  0. 掃盲
  1. 編譯,連接
  2. Makefile文件執行
  3. Makefile書寫規則
  4. 案例
  5. Makefile是如何工做的
  6. 拔高,參考spa

 

0. 掃盲3d

Linux 環境下的程序員若是不會使用GNU make來構建和管理本身的工程,應該不能算是一個合格的專業程序員,至少不能稱得上是 Unix程序員(是否是誇張了點,別人說的)。    code

什麼是makefile文件?它是一個指揮文件,指揮着源文件編譯的前後順序,以及如何連接在一塊兒。blog

 

1. 編譯,連接get

 

2. Makefile文件執行編譯器

寫好Makefile(或寫成makefile)文件後,直接執行命令make,編譯器會自動執行makefile裏的命令,進行編譯、連接知道生成最終能夠執行的文件。即編譯

make

 

3. Makefile書寫規則class

target : objects
    command

其中變量

  • target是能夠是目標文件(.o)也能夠是可執行文件,還能夠是個標籤(最後說)
  • objects是生成target依賴的文件
  • command是make要執行的文件(能夠是任意Shell命令)
  • 特殊字符:$@:目標文件,$^:全部的依賴文件,$<:第一個依賴文件

 

4. 案例

假設文件的關係以下圖

 

寫法1

main2 : main2.o sum.o hello.o
    g++ -o main2  main2.o sum.o hello.o
main2.o : main2.cc sum.h
    g++ -c main2.cc
sum.o : sum.cc sum.h hello.h
    g++ -c sum.cc
hello.o : hello.cc hello.h
    g++ -c hello.cc

參數 -o 後面是可執文件; -c後面是待編譯的文件。在前兩行中寫了不少重複的.o文件,能夠把它集合起來,用變量表示,以下:

 

寫法2

objects = main2.o sum.o hello.o
main2 : $(objects)
    g++ -o main2 $(objects)

main2.o : main2.cc sum.h
    g++ -c main2.cc
sum.o : sum.cc sum.h hello.h
    g++ -c sum.cc
hello.o : hello.cc hello.h
    g++ -c hello.cc

GUN的make至關強大,它能夠自動推導文件集文件依賴關係,寫法以下:

 

寫法3

objects = main2.o sum.o hello.o
main2 : $(objects)
    g++ -o main2 $(objects)

main2.o : sum.h
sum.o : sum.h hello.h
hello.o : hello.h

文件執行完了之後生成不少.o文件,能不能能夠刪除掉,能夠的,寫上命令(例如clean),下面是執行的操做,例如:

 

寫法4

objects = main2.o sum.o hello.o
main2 : $(objects)
    g++ -o main2 $(objects)

main2.o : sum.h
sum.o : sum.h hello.h
hello.o : hello.h

clean:
    rm *.o

這樣執行 make clean,就會執行rm *.o 刪除全部的.o文件,即

make clean

 

5. Makefile如何工做的?

  1. 輸入make後,會在目錄找Makefile、makefile
  2. 若是找到,它會在文件中找到第一個目標文件(例子中的main2)做爲最終的目標文件
  3. 若是main2不存在,就依靠後邊的.o文件生成
  4. 若是後邊的.o不存在,就利用下邊的g++ -c 生成
  5. .o文件都夠了,就連接生成最終的目標文件

 

6. 拔高,參考

跟我一塊兒寫Makefile-陳皓

相關文章
相關標籤/搜索