1. 程式人生 > >Linux作業系統至gcc編譯器、makefile

Linux作業系統至gcc編譯器、makefile

gcc編譯器:
        將高階語言程式碼編譯成為機器可識別的指令程式碼
        編譯檔案
        編譯步驟:
               1.預處理,展開所有程式碼  gcc-E只預處理   -o 指定修改後的檔名稱
               2.編譯:糾錯,沒有錯誤則將c語言程式碼編譯為彙編程式碼 gcc -S只進行編譯工作
               3.彙編:將彙編程式碼編譯為機器指令程式碼    gcc -c
                         走完彙編只是將當前的.c編譯成了自己的機器指令程式碼
                         其他的函式還沒有拿過來,這個檔案雖然是機器指令程式碼,但是不能執行
               4.連結:將所有呼叫的程式碼實現都拿過來生成可執行程式
                      庫:存放實現函式程式碼的地方
            動態庫:
                     生成可執行程式,連結動態庫,稱為動態連結
                      檔案格式 lib***.so
                     程式碼冗餘量小,佔用資源小,對庫的依賴程度高
            靜態庫:
                    生成可執行程式,連結靜態庫,稱為靜態連結
                    檔案格式   lib***.a
                    直接將庫檔案中的程式碼拷貝到可執行程式中,程式碼冗餘量高,對庫的依賴程度低
            (windows 下    動態.dll,靜態庫.lib)
       gcc編譯器預設連結方式是動態連結
       gcc  -static 連結方式指定為靜態連結

 

 

Makefile
        就是一個文字檔案,但是有一個make命令,逐步執行makefile中記錄的編譯規則
        makefile用於記錄專案的編譯規則,輔助專案的自動化編譯
        命名:M/makefile 
        
        #註釋以#開頭
        #Makefile編寫規則
            目標物件    不一定要生成,而是為了讓make能夠找到依賴關係
            依賴物件   主要用於判斷目標物件是否是最新的
            目標物件:依賴物件
            [tab]為了生成目標物件所執行的命令
            預定義變數
            
[email protected]
指目標物件
            $^ 指所有依賴物件
            $< 所有依賴物件中的第一個
            wildcard   獲取檔名        
            $()將括號中的字串當作命令處理
                命令的執行結果當作變數內容賦值給別的變數
            SRC=$(wildcard./*.c)
            main:$(SRC)
                gcc -o
[email protected]
$^
        

         makefile只為了生成第一個目標物件而存在,假如目標物件已經存在,make會判斷依賴物件和目標物件的時間,判斷目標物件是否是最新的,如果是最新的,則不需要編譯,直接退出,不是最新的則重新生成
        但是makefile這個特性導致只生成一個程式,因此後邊如果還有目標物件要生成,是不會生成的
        Makefile有個其他的特性:如果依賴物件不存在,則會在makefile中查詢依賴關係,看能不能生成這個依賴物件,如果有有則生成,沒有則報錯退出
            .PHONY  --宣告偽物件
                偽物件:不管是不是最新的,反正每次都要重新生成
            執行:make程式到當前工作目錄下找makefile檔案,解釋執行
                1.到當前目錄下查詢makefile檔案,找不到報錯
                2.在檔案中找第一個目標物件,並把這個物件當作終極目標
                3.檢測這個目標物件和依賴物件的最後一次修改時間,判斷是否需要
                重新編譯,如果需要修改時間一樣則不需要重新編譯,退出
                4.如果目標物件不存在,則直接生成,但是依賴物件有可能不存在
                5.為了生成終極目標,首先要保證依賴物件都存在,所以會先去生成所有
                依賴物件(依賴物件的生成的依賴關係也是使用者在下邊定義的)
                
                宣告偽物件:.PHONY
                    偽物件:每次都需要重新生成
                    假如當前目錄下有多個makefile時(makefile/Makefile),優先執行makefile
                    但是make只能執行一個
                預定義變數:[email protected] $^ $<
                =  非即時賦值
                := 即時賦值
                ?=  變數有值則不重新賦值   
                +=  追加
                四種賦值方式區別