【Linux】 自動化構建工具-make/Makefile

        一個工程中的源文件不計其數,其按類型、功能、模塊分別放在若干個目錄中,makefile定義了一系列的規則來指定,哪些文件需要先編譯,哪些文件需要後編譯,哪些文件需要重新編譯,甚至於進行更復雜的功能操作,因爲 makefile就像一個shell腳本一樣,其中也可以執行操作系統的命令。Makefile 文件描述了整個工程的編譯、連接等規則。其中包括:工程中的哪些源文件需要編譯以及如何編譯、需要創建那些庫文件以及如何創建這些庫文件、如何最後產生我們想要的可執行文件。儘管看起來可能是很複雜的事情,但是爲工程編寫Makefile 的好處是能夠使用一行命令來完成“自動化編譯”,一旦提供一個(通常對於一個工程來說會是多個)正確的 Makefile。編譯整個工程你所要做的唯一的一件事就是在shell 提示符下輸入make命令。整個工程完全自動編譯,極大提高了效率。

對Makefile的理解:依賴關係和依賴方法,下面給出例子,創建一個簡單的Makefile文件:
makefile的規則:
    目標(target):目標文件1 目標文件2
     <Tab>gcc -o 欲建立的執行文件 目標文件1 目標文件2
  目標(target)就是我們想要建立的信息,而目標文件就是具有相關性的 object files ,建立執行文件的語法就是以 <tab> 按鍵開頭的那一行!特別留意,『 命令行必須要以 tab 按鍵作爲開 頭』纔行!它的規則基本上是這樣的:
  •在 makefile 當中的 # 代表批註;
  •<tab> 需要在命令行 (例如 gcc 這個編譯程序指令) 的第一個字符;
  •標的 (target) 與相依檔案(就是目標文件)之間需以『 :』隔開。

這是一個簡單的Makefile文件,其中注意的是使用了Makefile的常用變量:

$^      代表所有的依賴文件

$<      代表第一個依賴文件

$@      代表目標

%.格式 代表所有該格式的文件

下面給出其它的文件:test.h    test.c   main.c




        使用make指令:make是一個命令工具,它解釋Makefile 中的指令(應該說是規則)。在Makefile文件中描述了整個工程所有文件的編譯順序、編譯規則。Makefile 有自己的書寫格式、關鍵字、函數。像C 語言有自己的格式、關鍵字和函數一樣。而且在Makefile 中可以使用系統shell所提供的任何命令來完成想要的工作。Makefile(在其它的系統上可能是另外的文件名)在絕大多數的IDE 開發環境中都在使用,已經成爲一種工程的編譯方法。

make的工作原理:

1. make會在當前目錄下找名字爲makefile或Makefile的文件。 

2. 如果找到,他會找文件中第一個目標文件,並把這個文件作爲最終的目標。 

3. 如果hello文件不存在,或是hello所依賴的後面的hello.o文件的文件修改時間要比hello這個文件。 

4. 如果hello所依賴hello.o文件不存在,那麼make會在當前文件中找目標爲hello.o文件的依賴性,如果找到則在根據那一個生成hello.o文件,以此類推。 

5. make會一層一層的去找文件的依賴關係,直到最終編譯出第一個目標文件,如果出現錯誤,或者沒找到,make會退出並報錯 。

6. 像clean這種,沒有被第一個目標文件直接或間接關聯,那麼它後面所定義的命令不會自動執行,需要“make clean”以清除所有的目標文件,一般這種clean的目標文件,我們將它設置爲僞目標,用.PHONY修飾,它的特點是總是被執行的。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章