Linux作業系統至gcc編譯器、makefile 阿新 • • 發佈:2018-12-30 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] $^ $< = 非即時賦值 := 即時賦值 ?= 變數有值則不重新賦值 += 追加 四種賦值方式區別