實例學習寫Makefile文件


目錄

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

 

0. 掃盲

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

什么是makefile文件?它是一個指揮文件,指揮着源文件編譯的先后順序,以及如何鏈接在一起。

 

1. 編譯,鏈接

 

2. Makefile文件執行

寫好Makefile(或寫成makefile)文件后,直接執行命令make,編譯器會自動執行makefile里的命令,進行編譯、鏈接知道生成最終可以執行的文件。即

make

 

3. Makefile書寫規則

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-陳皓


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM