我們把整個工程應該如何編譯鏈結,最終生成誰,寫在makefile檔案中,然後我們通過make整個命令,make就會去讀取這個makefile檔案的內容,然後根據makefile的內容幫我們把整個工程編譯鏈結生成最終的可執行程式。
管理工程 實現自動化編譯 (和 vs 比較)示例:
我們只能寫成makefile或者makefile
我們用all指定最終生成的目標檔案:可執行程式main程式
然後下面這一行是依賴關係:main程式要生成,依賴於3個.o檔案
然後是下面一行是規則命令:如何生成可執行程式呢?
因為main.o,add.o是原本就有的,所以我們接下來要給出main.o的依賴檔案
然後是規則命令
然後給出add.o的依賴檔案和規則命令
然後給出max.o的依賴檔案和規則命令
最後給出清理:clean,把中間的不必要的檔案清理掉(把.o檔案清理掉)。
我們來理解一下這個檔案:
它首先要生成main,所以它首先去找main的依賴檔案,找到全部的依賴檔案後,通過下面的這行規則命令生成可執行程式main。
但是,通常情況下,這個依賴檔案可能不具備,如果沒有找到這個add.o,就跑到下面去看這個add.o有沒有依賴於其他檔案,這時候我們發現它依賴於add.c,然後通過下面的規則 gcc -c add.c生成add.o,有了add.o然後去找max.o,如果沒有找到max.o,就去找他的依賴檔案:max.c,然後按照規則命令生成max.o,以此類推。等待這3個.o檔案都具備了,就利用gcc -o main main.o add.o max.o生成可執行程式main
中間可能會生成.o檔案,如果我們不需要這些檔案呈現給客戶,我們就執行clean的命令進行清理。
注意編寫紅色**部分時 先回到首部,然後按tab鍵,再書寫**
make
根據 makefile 檔案的規則生成可執行程式
如果我們此時修改一下add.c的檔案,其他檔案不動。
只對剛才修改過的檔案進行編譯
如果我們再執行make的話
它會提醒我們沒什麼事情去做
我們可以清理掉整個工程,所以中間生成的檔案就都沒有了
重新生成:
它是怎麼清除的?我們剛才改了哪個檔案,怎麼知道編譯的時候只編譯它呢?
它是根據最後修改的時間進行判斷,比如說,我們在1點的時候寫好所有.c檔案,在2點的時候開始進行編譯,那麼所有.o檔案就是在2點生成的,我們在3點的時候進行鏈結,生成可執行程式,然後在4點時我去改了add.c檔案,這時候時間就不對了,本來所有的.c檔案都是在1點,.o是在2點,main程式在3點,這個時間關係必須是順序的,如果後來把add.c檔案改了,時間就反過來了,add.c的最後修改的時間變成比main程式還晚,main程式是依賴add.o的,add.o是依賴add.c的,add.o檔案是2點,而add.c現在是4點,說明時間是改了,觸發了add.c重新生成add.o,add.o進行鏈結生成可執行程式main
./main 即可執行
還可以makefile檔案進行安裝,在檔案的末尾給個install,把可執行程式拷貝到存放命令的目錄底下,就可以執行了
linux核心可載入模組的makefile
在開發linux核心驅動時,免不了要接觸到makefile的編寫和修改,儘管網上的makefile模板一大堆,做一些簡單的修改就能用到自己的專案上,但是,對於這些基礎的東西,更應該做到知其然並知其所以然。本篇文章中只討論linux核心模組編譯的makefile,linux核心makefile總覽可以...
Linux核心開發 最簡單的Makefile
最簡單的linux驅動程式 至少需要乙個makefile,乙份源 本文簡單解釋makefile中的各個make target的意義。這裡只是介紹乙個簡單的基礎的makefile,生產環境需要更好的makefile模板和構建工具。示例 obj m helloword.o pwd shell pwd k...
Linux下C語言程式設計基礎 Makefile
假設我們有下面這樣的乙個程式,源 如下 main.c include mytool1.h include mytool2.h int main int argc,char argv mytool1.h ifndef mytool 1 h define mytool 1 h void mytool1 ...