MakeFile文件是什么——內容、工作原理、作用、使用


MakeFile文件是什么?它里面包含什么內容、具有什么作用、怎么使用?下面就來具體說說。

     什么是makefile?或許很多Winodws的程序員都不知道這個東西,因為那些Windows的IDE都為你做了這個工作,但我覺得要作一個好的和 professional的程序員,makefile還是要懂。這就好像現在有這么多的HTML的編輯器,但如果你想成為一個專業人士,你還是要了解 HTML的標識的含義。特別在Unix下的軟件編譯,你就不能不自己寫makefile了,會不會寫makefile,從一個側面說明了一個人是否具備完 成大型工程的能力。
     因為,makefile關系到了整個工程的編譯規則。一個工程中的源文件不計數,其按類型、功能、模塊分別放在若干個目錄中,makefile定義了一系 列的規則來指定,哪些文件需要先編譯,哪些文件需要后編譯,哪些文件需要重新編譯,甚至於進行更復雜的功能操作,因為makefile就像一個Shell 腳本一樣,其中也可以執行操作系統的命令。
makefile帶來的好處就是——“自動化編譯”,一旦寫好,只需要一個make命令,整個工程完全自動編譯,極大的提高了軟件開發的效率。make是 一個命令工具,是一個解釋makefile中指令的命令工具,一般來說,大多數的IDE都有這個命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可見,makefile都成為了一種在工程方面的編譯方法。

一、什么是Makefile?

   makefile文件保存了編譯器和連接器的參數選項,還表述了所有源文件之間的關系(源代碼文件需要的特定的包含文件,可執行文件要求包含的目標文件模塊及庫等).創建程序(make程序)首先讀取makefile文件,然后再激活編譯器,匯編器,資源編譯器和連接器以便產生最后的輸出,最后輸出並生成的通常是可執行文件.創建程序利用內置的推理規則來激活編譯器,以便通過對特定CPP文件的編譯來產生特定的OBJ文件. 
附上原文: 
Experienced  programmers  are  familiar  with  makefiles.  A  makefile  stores compiler  and  linker  options  and  expresses  all  the  interrelationships  among source  files.  (A  source  code  file  needs  specific  include  files,  an executable  file  requires  certain  object  modules  and  libraries,  and  so  forth.)  A  make  program  reads  the  makefile  and  then  invokes  the  compiler, assembler,  resource  compiler,  and  linker  to  produce  the  final  output,  which is  generally  an  executable  file.  The  make  program  uses  built-in  inference rules  that  tell  it,  for  example,  to  invoke  the  compiler  to  generate  an OBJ  file  from  a  specified  CPP  file.

二、Make是如何工作的?

在默認的方式下,也就是我們只輸入make命令。那么,

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

2、如果找到,它會找文件中的第一個目標文件(target),在上面的例子中,他會找到“edit”這個文件,並把這個文件作為最終的目標文件。

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

4、如果edit所依賴的.o文件也不存在,那么make會在當前文件中找目標為.o文件的依賴性,如果找到則再根據那一個規則生成.o文件。(這有點像一個堆棧的過程)

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

   這就是整個make的依賴性,make會一層又一層地去找文件的依賴關系,直到最終編譯出第一個目標文件。在找尋的過程中,如果出現錯誤,比如最后被依賴的文件找不到,那么make就會直接退出,並報錯,而對於所定義的命令的錯誤,或是編譯不成功,make根本不理。make只管文件的依賴性,即,如果在我找了依賴關系之后,冒號后面的文件還是不在,那么對不起,我就不工作啦。

   通過上述分析,我們知道,像clean這種,沒有被第一個目標文件直接或間接關聯,那么它后面所定義的命令將不會被自動執行,不過,我們可以顯示要make執行。即命令——“make clean”,以此來清除所有的目標文件,以便重編譯。

   於是在我們編程中,如果這個工程已被編譯過了,當我們修改了其中一個源文件,比如file.c,那么根據我們的依賴性,我們的目標file.o會被重編譯(也就是在這個依性關系后面所定義的命令),於是file.o的文件也是最新的啦,於是file.o的文件修改時間要比edit要新,所以 edit也會被重新鏈接了(詳見edit目標文件后定義的命令)。

   而如果我們改變了“command.h”,那么,kdb.o、command.o和files.o都會被重編譯,並且,edit會被重鏈接。

三、Makefile里有什么?

   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]鍵開始。


免責聲明!

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



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