編寫簡單的makefile

2021-04-22 07:32:20 字數 1798 閱讀 6794

假如有乙個上百個檔案的**構成的專案,如果只是對其中乙個或少數幾個檔案進行了修改,若用gcc編譯工具就不得不把整個專案裡的檔案重新編譯一遍。

編譯過程分為編譯、彙編鏈結等階段。其中,編譯階段僅檢查語法錯誤以及函式與變數的宣告是否正確,在鏈結階段則主要完成函式鏈結和全域性變數的鏈結。因此,沒有改動的源**根本不需要重新編譯,而只需將它們重新鏈結進去就可以了。

make工程管理器是乙個「自動編譯管理器」,這裡的「自動」是指它能夠根據檔案時間戳自動發現更新過的檔案而減少編譯的工作量。同時,它通過讀入makefile檔案的內容來執行大量的編譯工作。使用者只需編寫一次簡單的編譯語句就可以了。

編寫makefile檔案乙個makefile檔案中通常包含如下內容:

makefile的書寫規則:

目標檔案:依賴檔案

(tab)產生目標檔案的命令

注意:gcc前面的空格是用tab生成,而不是按空格鍵。

2.使用makefile編譯檔案的操作步驟

例如:

分成檔案  2-5-main.c,2-5-fun1.c,2-5-fun2.c,my.h

例如:2-5:2-5-main.o 2-5-fun1.o 2-5-fun2.c

gcc 2-5-main.o 2-5-fun1.o 2-5-fun2.o -o 2-5

2-5-main.o:2-5-main.c my.h

gcc 2-5-main.c -c

2-5-fun1.o:2-5-fun1.c

gcc 2-5-fun1.c -c

2-5-fun2.o:2-5-fun2.c

gcc 2-5-fun2.c -c 

在編輯makefile檔案時可以自定義一些變數來代表一串文字,例如

cc=gcc

objects=2-5-main.o 2-5-fun1.o 2-5-fun2.o

2-5:$(objects)

$(cc) $(objects) -o 2-6

..........

在這個makefile檔案中,目標檔案(target)包含可執行檔案2-5和中間目標檔案(*.o)。依賴檔案(prerequisites)包含冒號後面大的那些.c檔案和.h檔案。每乙個.o檔案都有一組依賴檔案,而這些.o檔案又是可執行檔案2-5的依賴檔案。依賴關係的實質是說明目標檔案由哪些檔案生成。在定義好依賴關係後,後續的**定義如何生成目標檔案的作業系統命令,其一定要以乙個tab鍵作為開頭。

編寫好makefile檔案後,用make命令編譯,指定makefile檔案需要在make後面加引數-f,例如:

make -f makefile2-5

在預設方式下,只輸入make命令,其會做如下工作:

1) make會在當前目錄下查詢名字為makefile 的檔案或「makefile資料夾」的檔案。如果找到,它會找檔案中的第乙個目標檔案(target)。如果該目標檔案不存在,或是該目標檔案所依賴的.o檔案的修改時間比它新,就會執行後面所定義的命令來生成第乙個目標檔案。

2)  如果第乙個目標檔案所依賴的.o檔案也存在,make會在當前檔案中找目標為.o檔案的依賴性,如果找到,則會根據規則生成.o檔案。

3)  c檔案和h檔案如果存在,make會生成.o檔案,然後再用.o檔案生成make的最終結果,也就是可執行檔案,即第乙個目標檔案。

這就是整個make的依賴性,make會一層又一層地去找檔案的依賴性,直到最終編譯出第乙個目標檔案。在尋找的過程中,如果出現錯誤,則make會直接退出,並報錯。對所定義的命令的錯誤,或是編譯不成功,make就不會處理。如果在make找到了依賴關係之後,冒號後面的檔案不存在,make仍不工作。

輸入命令:

./2-5

簡單編寫makefile

乙個makefile基本的規則 a b tab tab a為目標檔案,b為依賴檔案 可能含有多個 接下來為命令 必須含有tab 操作依賴檔案得到目標檔案 以乙個簡單的示例來演示如何編寫乙個基礎的makefile ifndef file1 h define file1 h ifdef cplusplu...

簡單的makefile編寫

cc gcc cflags wall i home coc target sysroots corei7 64 poky linux usr include libxml2 ldflags l home coc target sysroots corei7 64 poky linux usr lib...

簡單Makefile的編寫

在乙個較大的工程中,工程的原始檔按不同的型別 功能 模組分類,這樣給我們在編譯的過程中就增加了較大的工程量,並且有些還有可能要進行一些較為複雜的操作。編譯一次還可以,但我們在除錯的過程中不可能只編譯一次,為了解決這個麻煩,做到一勞永逸。我們就可以通過編寫makefile將這些需要執行的步驟寫進去。因...