歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Makefile,Linux程序員你傷不起

Makefile,Linux程序員你傷不起

日期:2017/2/28 16:07:49   编辑:Linux教程

1. 概述

Makefile,what??很多Windows程序可能都沒聽說過
簡單的說,Makefile是Unix/Linux環境下描述了整個工程的編譯、連接等規則的文件,其主要包括三點:
1) 工程中的哪些源文件需要編譯以及如何編譯
2) 依賴庫以及庫所在的位置
3) 想得到什麼:可執行文件?靜態庫?動態庫?
項目中,我們會有很多源文件、頭文件、依賴庫文件、配置文件等等,通過Makefile定義規則來制定編譯順序,編譯規則,編譯依賴,甚至更復雜的功能,將極大的方便我們的開發,其最大的好處就是”自動化編譯“,通過‘make’就可以方便的進行整個項目的編譯工作。

2. 編譯鏈接

從源碼到可執行文件,具體步驟:
源碼--->預處理--->編譯--->匯編--->鏈接
我們常常把預處理、編譯和匯編三個階段統稱為編譯階段,在這個階段,編譯器會檢查程序語法、函數與變量是否聲明等。
經過編譯之後,unix/linux下,將得到.o文件(一般來說,每個源文件都能生成一個對應的.o文件),即object file(windows下即.obj文件),.o不能直接運行,我們需要將其合成可執行文件,這個過程就叫鏈接。在鏈接過程,鏈接器會在所有的.o文件中找尋函數的實現,如果找不到,則會報鏈接錯誤。

3.Makefile規則

Makefile只有一個規則:

target: prerequisites
command

target:即目標,它可以是可執行文件、可以是.o文件,也可以是一個標簽,簡單的說,它就是你要做的事情。
prerequisites:生成target所需要的條件,它可以是一個文件,也可以是另外一個target
command:具體執行的命令

解釋如下:target這個目標依賴於prerequisites中的文件,其生成規則定義在command中。
更簡單一點表達:如果prerequisites中任何一個文件的時間要比target文件更新的話,command所定義的命令就會執行。

eg:
=====makefile=====
#第一個規則
test: main.o hello.o
gcc main.o hello.o –o test

#第二個規則
main.o: main.c
gcc –c main.c

#第三個規則
hello.o: hello.c hello.h
gcc –c hello.c

#第四個規則
clean :
rm –rf *.o
rm –rf test
=====makefile=====

第一個規則:
test就是target, main.o和hello.o是prerequisites,'gcc main.o hello.o –o test’是command。
即:要生成test,就需要有main.o和hello.o,如果main.o或者hello.o文件的時間比test新(或者test文件不存在),則會執行命令’gcc main.o hello.o –o test’,

第二個規則:
target是main.o,main.c是prerequisites,’gcc –c main.c’是command
即:要生成test,就需要main.c,如果main.c文件的時間比main.o新,則會執行’gcc –c main.c’

第三個規則和第二個規則類似

第四個規則:
這裡,target是clean,此處,clean並不是一個文件,而是一個動作的名字,它的執行,需要顯示的在make命令後制定,例如,此處執行‘make clean’,將調用其後的command,即‘rm –rf *.o rm –rf test’,另外,此處沒有prerequisites,即任何時候都執行command

我們來看下如果執行'make'會做什麼:

1、make會在當前目錄下找名字叫“Makefile”或“makefile”的文件。
2、如果找到,它會找文件中的第一個目標文件(target),在上面的例子中,他會找到“test”這個文件,並把這個文件作為最終的目標文件。
3、如果test文件不存在,或是test所依賴的後面的[.o]文件的文件修改時間要比test這個文件新,那麼,他就會執行後面所定義的命令來生成test這個文件。
4、如果test所依賴的.o文件存在,那麼make會在當前文件中找目標為.o文件的依賴性,如果找到則再根據那一個規則生成.o文件。
5、依次類推,直到生成的所有的target都是最新的。

用戶如果執行'make clean',由於其後面沒有依賴,則執行command所定義的命令。

如果我們修改了代碼main.c,然後執行‘make’,由於main.c時間比main.o新,那麼main.o會重新編譯生成,由於main.o文件的時間比test新,那麼test也會重新生成。

Copyright © Linux教程網 All Rights Reserved