Linux中基於g++的makefile文件的總結與注意的地方


makefile的作用就是定義一系列的依賴規則,在執行make命令的時候,依據這個規則執行就可以了!

makefile關系到了整個工程的編譯規則。一個工程中的源文件不計數,其按類型、功能、模塊分別放在若干個目錄中,makefile定義了一系列的規則來指定,哪些文件需要先編譯,哪些文件需要后編譯,哪些文件需要重新編譯,甚至於進行更復雜的功能操作,因為makefile就像一個Shell腳本一樣,其中也可以執行操作系統的命令。

相較於編譯器的優點與缺點:

1,編譯速度上:通過makefile文件進行編譯,在第一次編譯成功之后,以后由於項目中文件的增上改,makefile會選擇性的進行編譯,而不是全部工程都編譯一次,在大型項目上速度非常有優勢,而用編輯器來自動編譯的時候,每次修改都會全部編譯一次,當項目比較大的時候就非常慢了。
2.方便性:makefile的缺點就是需要人為的去寫這個文件,而編輯器(Windows的IDE,例如:Visual Studio)自動幫你編譯,不需要你人為的寫。

在學生時代,由於沒有接觸大型的項目,只是編程學習而已,所以對編輯器比較依賴,也就對makefile了解的較少,當你走上崗位后,makefile是必須要學習的,作為一個professional的程序員,需要對自己有點高要求,如果你沒有接觸,或者不懂makefile的話,也說明你沒有參加過大的項目開發。makefile會與否,從一定的方面上說明了這個人是否具備完成大型工程的能力。

Makefile的規則:


    target ... : prerequisites ...
            command
            ...
            ...

target也就是一個目標文件,可以是Object File,也可以是執行文件。

prerequisites就是,要生成那個target所需要的文件或是目標。

command也就是make需要執行的命令。(任意的Shell命令)

這是一個文件的依賴關系,也就是說,target這一個或多個的目標文件依賴於prerequisites中的文件,其生成規則定義在command中。說白一點就是說,prerequisites中如果有一個以上的文件比target文件要新的話,command所定義的命令就會被執行。這就是Makefile的規則。也就是Makefile中最核心的內容。

makefile的編譯規則:

make會比較targets文件和prerequisites文件的修改日期,如果prerequisites文件的日期要比targets文件的日期要新,或者target不存在的話,那么,make就會執行后續定義的命令。

Makefile里主要包含了五個內容:顯式規則、潛規則(默認規則)、變量定義、文件指示和注釋。

1、顯式規則。顯式規則說明了,如何生成一個或多的的目標文件。這是由Makefile的書寫者明顯指出,要生成的文件,文件的依賴文件,生成的命令。

2、潛規則。由於我們的make有自動推導的功能,所以潛規則可以讓我們比較粗糙地簡略地書寫Makefile,這是由make所支持的。

3、變量的定義。在Makefile中我們要定義一系列的變量,變量一般都是字符串,這個有點你C語言中的宏,當Makefile被執行時,其中的變量都會被擴展到相應的引用位置上。

4、文件指示。其包括了三個部分,一個是在一個Makefile中引用另一個Makefile,就像C語言中的include一樣;另一個是指根據某些情況指定Makefile中的有效部分,就像C語言中的預編譯#if一樣;還有就是定義一個多行的命令。有關這一部分的內容,我會在后續的部分中講述。

5、注釋。Makefile中只有行注釋,和UNIX的Shell腳本一樣,其注釋是用“#”字符,這個就像C/C++中的“//”一樣。如果你要在你的Makefile中使用“#”字符,可以用反斜框進行轉義,如:“/#”。

特別注意:在Makefile中書寫命令,必須要以[Tab]鍵開始。

寫makefile需要注意的地方:

1.在定義好依賴關系后,后續的那一行定義了如何生成目標文件的操作系統命令,就是寫command時,一定要以一個Tab鍵作為開頭,一定要以一個Tab鍵作為開頭,一定要以一個Tab鍵作為開頭,重要的事說三遍,不然會出錯的。
2.如果你寫的是c語言,就用cc命令,如果你寫的是C++,就用g++的命令,cc命令不會自動鏈接,如果你用cc為c++文件寫命令,會出現鏈接失敗的提示。
3.當makefile比較復雜,共同的依賴文件比較多的時候,使用變量會非常方便,有點類似開發中的配置文件的作用。
4.當makefile比較復雜,可以用make中潛規則(默認規則)——make自動推導;來結合makefile中的變量使用。
5.寫makefile文件的時候 ,推薦寫上目標文件的清除命令——一方面,不僅方便你重編譯,另一方面,也利於保持文件的清潔。
6.
未完待續.............................!

這篇文章是在參考別人的資料前提下進行總結的,由於本人能力有限,如有觀點錯誤或者理解的不到位,請各位指正!

參考資料:

跟我一起寫 Makefile(一).
跟我一起寫 Makefile(二).
跟我一起寫 Makefile(三).
跟我一起寫 Makefile(四).
跟我一起寫 Makefile(五).
跟我一起寫 Makefile(六).
跟我一起寫 Makefile(七).
跟我一起寫 Makefile(八).
跟我一起寫 Makefile(九).
跟我一起寫 Makefile(十).
跟我一起寫 Makefile(十一).
跟我一起寫 Makefile(十二).
跟我一起寫 Makefile(十三).
跟我一起寫 Makefile(十四).


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM