站長資訊網
        最全最豐富的資訊網站

        帶你掌握Linux項目自動化構建工具Makefile make

        本篇文章給大家帶來了linux中項目自動化構建工具,在現實生活中我們進行某一項功能往往不能僅僅依賴于一個文件的代碼進行操作,需要多個不同的版塊進行組合實現,這個時候需要構建成一個項目,將所有的模塊打包組合實現最終功能。希望對大家有幫助。

        帶你掌握Linux項目自動化構建工具Makefile  make

        Makefile

        Makefile是一個文本文件,記錄一個項目的構建規則流程。在工作中會不會寫makefile,從一個側面說明了一個人是否具備完成大型工程的能力,同時一個工程中的源文件不計數,其按類型、功能、模塊分別放在若干個目錄中,makefile定義了一系列的規則來指定,哪些文件需要先編譯,哪些文件需要后編譯,哪些文件需要重新編譯,甚至于進行更復雜的功能操作,其帶來的好處就是——“自動化編譯”,一旦寫好,只需要一個make命令,整個工程完全自動編
        譯,極大的提高了軟件開發的效率。

        make

        make是一個命令工具,是一個解釋makefile中指令的命令工具,一般來說,大多數的IDE都有這個命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可見,makefile都成為了一
        種在工程方面的編譯方法。make是一條命令,makefile是一個文件,兩個搭配使用,完成項目自動化構建。

        工作原理

        在Makefile中會形成各個文件之間的依賴關系,比如一個code.exe是在code.o 的基礎上通過鏈接生成的,而code.o是在code.s的基礎上通過匯編形成的,code.s是在code.i的基礎上通過編譯生成,code.i是在code.c的基礎上預處理完成之后生成,如此層層尋找源頭。其規則使用倒敘的方法,將第一個文件視作最后完后的文件,若當前文件未生成則通過依賴關系以及相互生成的方法進行層層推進,最終完成全部文件的形成。
        依賴關系

        A:B ??A是依賴于B

        依賴方法

        gcc 選項 + B -o +A ??A是B經過處理生成的文件

        項目清理

        工程是需要被清理的,像clean這種,沒有被第一個目標文件直接或間接關聯,那么它后面所定義的命令將不會被自動執行,不過,我們可以顯示要make執行。即命令——“make clean”,以此來清除所有的目標文件,以便重編譯。但是一般我們這種clean的目標文件,我們將它設置為偽目標,用 .PHONY 修飾,偽目標的特性是,總是被
        執行的。

        原理

        make會在當前目錄下找名字叫“Makefile”或“makefile”的文件。

        如果找到,它會找文件中內容中的第一個文件,并把這個文件作為最終的目標文件。

        如果該文件當前不存在,或是該文件的依賴文件的修改時間要比當前這個文件要新,那么,他就會執行后面所定義的命令來生成當前文件。

        如果該文件的依賴文件不存在,那么便對這個依賴文件進行如同第2,3步的步驟,知道找到最后的源文件為止

        當然,你的C文件和H文件是存在的啦,于是make會生成 .o 文件,然后再用 .o 文件聲明make的終極任務,也就是執行文件了。

        這就是整個make的依賴性,make會一層又一層地去找文件的依賴關系,直到最終編譯出第一個目標文件。

        在找尋的過程中,如果出現錯誤,比如最后被依賴的文件找不到,那么make就會直接退出,并報錯,而對于所定義的命令的錯誤,或是編譯不成功,make根本不理。

        make只管文件的依賴性,即,如果在我找了依賴關系之后,冒號后面的文件還是不在,那么對不起,我就不工作啦。

        make 每次在Makefile中只會找到第一個目標對象進行生成,生成之后就會退出(不會生成第二個對象)

        .PHONY: clean

        clear:

        ??rm -rf $(obj)

        【補充】

        1.預定義變量的使用:[$@ ]、[ $^]、[ $<],可以用以上三個對文件名進行替換

        $@ :表示目標對象

        $^:表示所有依賴對象

        &<:表示依賴對象的第一個

        2. $ (wildcard ./.c)獲取當前目錄下所有的以.c結尾的文件的文件名稱【例】 src=$(wildcard ./.c) ? code: $ (str)

        3. $ (patsubst %.c, %.o,$(str))表示將str變量中的.c文件替換成.o,然后存放在obj變量中。

        4. 偽對象:聲明一個目標對象與外部文件無關,表示每次對這個對象不管是否最新都要重新生成,且不管外部是否能夠存在,都要每次無論如何都執行語句[.PHONY:]

        5.程序的編譯過程:一般包含預處理、編譯、匯編、鏈接,但是在實際項目構建中整體分為兩步,即編譯和鏈接。這樣的好處在于,如果只是修改了一個.c文件,對于之前的直接對所有.c進行編譯生成可執行程序的過程來說,需要重新編譯所有的.c生成可執行程序,這樣的效率非常低下,因此分為兩步進行操作,先把每個.c都是生成自己的.o,然后再將所有的.o鏈接在一起,一旦一個.c發生改變只需要對這一個.c進行生成.o之后,替換程序中的指定模塊就可以。

        例1. 創建一個一般的Makefile

        帶你掌握Linux項目自動化構建工具Makefile  make

        帶你掌握Linux項目自動化構建工具Makefile  make

        例2. 使用預定義編寫的Makefile

        帶你掌握Linux項目自動化構建工具Makefile  make

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 自拍中文精品无码| 99久久精品毛片免费播放| 国产精品对白交换视频| 久久久无码精品午夜| 欧美高清在线精品一区| 日韩精品无码一区二区三区不卡 | 久久精品人成免费| 亚洲av午夜成人片精品电影| 国内精品久久久久久久coent | 99麻豆久久久国产精品免费| 久久久久久亚洲Av无码精品专口 | 亚洲日韩一页精品发布| 国产乱人伦偷精品视频不卡| 色综合久久综精品| 国产伦精品一区二区三区女 | 91探花福利精品国产自产在线| 久久精品夜夜夜夜夜久久| 自拍偷自拍亚洲精品被多人伦好爽| 精品无码专区亚洲| 精品91自产拍在线观看| 国产精品无打码在线播放| 99热热久久这里只有精品68| 午夜精品视频在线| 四虎成人www国产精品| 久久九九有精品国产23百花影院| 国产在线不卡午夜精品2021| 国产精品麻豆高清在线观看| 精品免费视在线观看| 欧美大片日韩精品| 国产91在线精品| 精品国产福利尤物免费| 精品人妻少妇一区二区三区在线| 精品国产国产综合精品| 久久夜色精品国产亚洲av| 亚洲精品第一国产综合精品99| 中国国产精品| 蜜臀久久99精品久久久久久小说| 久久精品国产第一区二区三区| 国产午夜福利精品久久2021| 国产精品久久一区二区三区| 91亚洲精品自在在线观看|