linux中的‘make’和‘makefile’

       在提及‘make’和‘makefile’之前有必要先理清楚程序編譯的過程,在windows操作系統下,我們一般使用的編寫程序的軟件有vs、vc等,這些都是集成軟件,當編寫完程序之後,直接點擊進行編譯和鏈接,那麼編譯器是怎樣將程序進行編譯的呢?


◆編譯過程

(1)預處理階段

         將程序編輯完成之後,在編譯之前,編譯器會先對程序進行一下預處理,預處理階段一般的工作是將程序的註釋去掉,將頭文件在源文件之中進行展開,同時進行宏替換等操作,經過處理之後就會生成一個.i文件。

(2)編譯階段

        將編譯的源程序轉換爲彙編代碼,生成.s文件。

(3)彙編階段

        將彙編文件.s轉換爲計算機能夠識別的二進制文件.o文件。

(4)鏈接階段

        將引用其他的.o文件和二進制文件鏈接到一塊,形成二進制文件.exe。


        windows上面的編譯環境都是集成化的,程序員可以不用過於在於程序執行的過程,但是在liunx系統中編輯器、編譯器、調試器都是分隔開的,我這裏使用的編輯器是vim,編譯器是gcc,調試器爲gdb,這裏需要澄清一下make和makefile(也可以爲Makefile)的區別?

        make和makefile是兩個完全不一樣的東西,make是一條指令,能夠進行程序的編譯,而makefile是一個文件,一般可以使用gcc指令進行編譯生成許多的目標文件,makefile文件中都是一些編譯的指令,當makefile文件寫好之後,只需要使用make指令就能夠完成編譯過程,下面以一個簡單的程序介紹一下linux中程序的執行過程:


■編寫main.c文件

wKioL1dMPMfyHLlZAAA2TSx2b_Y635.png

■編寫test.c文件

wKioL1dMPRrTr-FEAAA_vf6h2pg008.png

■編寫test.h文件

wKioL1dMPZDR6dXSAAAoGMAgY3Y623.png

        顯而易見,如果想要執行main.c文件就離不開這三個文件,那這三個文件之間存在什麼樣的關係呢?想要執行程序就需要有main.o、test.o文件,而test.o和main.o文件就需要有test.s和main.s文件,同時main.s和test.s文件又依賴於main.i和test.i文件,而這兩個文件又依賴於main.c和test.c文件,編譯過程中產生的文件之間都存在這依賴關係,即就是編譯的逆過程,下面進行簡單的圖示:


wKiom1dMRD6z-GENAAAaWyXS8ZU002.png


◆下面是簡寫的makefile文件:


wKioL1dMQSOStD0qAABanMNOetI635.png


        根據上面的makefile文件,簡單的介紹一下makefile文件的執行過程,makefile文件是順序執行的,執行過程中會按照指令生成對應的目標文件,clean是一個動作的名字,當輸入make進行編譯時,不會執行clean的內容,如果輸入命令make clean的指令,然後就直接跳到clean位置執行clean的內容,將剛纔編譯時產生的目標文件進行刪除,下面是程序執行的過程:


wKiom1dNhEnRsj6AAABLC0Ek920579.png

wKioL1dNhwqix91hAAAlB96mTZE257.png


注意: 

(1) 如果不想變異的過程中,將執行的編譯指令輸出,可以在makefile文件中的編譯指令前進行添加@字符,即就是@gcc -c test.c    ,這樣執行的指令就會被隱藏。


(2)makefile中使用的註釋符號爲‘#’。


(3)clean只是一個動作的名字,它是沒有依賴關係的,所以clean的後面只有‘:’,沒有其他的文件之類的東西。






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章