一個工程中的源文件不計其數,其按類型、功能、模塊分別放在若干個目錄中,makefile定義了一系列的規則來指定,哪些文件需要先編譯,哪些文件需要後編譯,哪些文件需要重新編譯,甚至於進行更復雜的功能操作,因爲 makefile就像一個shell腳本一樣,其中也可以執行操作系統的命令。Makefile 文件描述了整個工程的編譯、連接等規則。其中包括:工程中的哪些源文件需要編譯以及如何編譯、需要創建那些庫文件以及如何創建這些庫文件、如何最後產生我們想要的可執行文件。儘管看起來可能是很複雜的事情,但是爲工程編寫Makefile 的好處是能夠使用一行命令來完成“自動化編譯”,一旦提供一個(通常對於一個工程來說會是多個)正確的 Makefile。編譯整個工程你所要做的唯一的一件事就是在shell 提示符下輸入make命令。整個工程完全自動編譯,極大提高了效率。
這是一個簡單的Makefile文件,其中注意的是使用了Makefile的常用變量:
$^ 代表所有的依賴文件
$< 代表第一個依賴文件
$@ 代表目標
%.格式 代表所有該格式的文件
下面給出其它的文件:test.h test.c main.c
使用make指令:make是一個命令工具,它解釋Makefile 中的指令(應該說是規則)。在Makefile文件中描述了整個工程所有文件的編譯順序、編譯規則。Makefile 有自己的書寫格式、關鍵字、函數。像C 語言有自己的格式、關鍵字和函數一樣。而且在Makefile 中可以使用系統shell所提供的任何命令來完成想要的工作。Makefile(在其它的系統上可能是另外的文件名)在絕大多數的IDE 開發環境中都在使用,已經成爲一種工程的編譯方法。
make的工作原理:
1. make會在當前目錄下找名字爲makefile或Makefile的文件。
2. 如果找到,他會找文件中第一個目標文件,並把這個文件作爲最終的目標。
3. 如果hello文件不存在,或是hello所依賴的後面的hello.o文件的文件修改時間要比hello這個文件。
4. 如果hello所依賴hello.o文件不存在,那麼make會在當前文件中找目標爲hello.o文件的依賴性,如果找到則在根據那一個生成hello.o文件,以此類推。
5. make會一層一層的去找文件的依賴關係,直到最終編譯出第一個目標文件,如果出現錯誤,或者沒找到,make會退出並報錯 。
6. 像clean這種,沒有被第一個目標文件直接或間接關聯,那麼它後面所定義的命令不會自動執行,需要“make clean”以清除所有的目標文件,一般這種clean的目標文件,我們將它設置爲僞目標,用.PHONY修飾,它的特點是總是被執行的。