【Linux】makefile文件

makefile介紹:

【1】 make命令執行時,需要一個 makefile 文件,以告訴make命令如何去編譯和鏈接程序。

【2】這裏通過一個例子讓我們更直觀的去了解它的編寫規則,我們的規則是:

1)如果這個工程沒有編譯過,那麼我們的所有c文件都要編譯並被鏈接。
2)如果這個工程的某幾個c文件被修改,那麼我們只編譯被修改的c文件,並鏈接目標程序。
3)如果這個工程的頭文件被改變了,那麼我們需要編譯引用了這幾個頭文件的c文件,並鏈接目標程序。

只要我們的makefile寫得夠好,所有的這一切,我們只用一個make命令就可以完成,make命令會自動智能地根據當前的文件修改的情況來確定哪些文件需要重編譯,從而自己編譯所需要的文件和鏈接目標程序。

makeflie文件的編寫規則:

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

target可以是一個object file(目標文件),也可以是一個執行文件,還可以是一個標籤(label)。對於標籤這種特性,在後續的“僞目標”章節中會有敘述。

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

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

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

例1:
這裏寫圖片描述
注:在依賴方法那行,一定要以Tab鍵開頭。“.PHONY”表示,clear是個僞目標文件。

make的工作原理

在默認的方式下,也就是我們只輸入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會一層又一層地去找文件的依賴關係,直到最終編譯出第一個目標文件。

例2:
編寫一個簡單的makefile ,如果有一個工程有1個頭文件,3個.c文件,我們將他們寫進makefile文件應該是下面這個樣子的:

.PHONY:all
all:client server

client:client.c comm.c
    gcc client.c comm.c -o client

server:server.c comm.c
    gcc server.c comm.c -o server

.PHONY:clean
clean:
    rm server client

在上面的基礎上makefile文件還可以再簡化一點

.PHONY:all
all:server client

client:client.c comm.c
    gcc $^ -o $@   

server:server.c comm.c
    gcc $^ -o $@    

.PHONY:clean        
clean:              
    rm server client  

還可以寫成下面這種格式

.PHONY:all
all:server client

client:client.c comm.c
    gcc -o $@ $^    

server:server.c comm.c
    gcc -o $@ $^    

.PHONY:clean        
clean:              
    rm server client  

說明:
執行makefile文件時在命令行輸入make然後按回車;當要清除生成文件時,在命令輸入 make clean 然後按回車。

發佈了70 篇原創文章 · 獲贊 92 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章