Makefile 入門與基本語法 分類: C/C++ ubuntu 2015-05-18 11:16 466人閱讀 評論(0) 收藏

在我看來,學會寫簡單的Makefile,閱讀較複雜的makefile,是每個Linux程序員都必須擁有的基本素質。Makefile能夠自動識別哪些源文件被更改過,須要從新編譯,那些不須要。從而節省大型工程從新編譯的時間。規則以下:程序員

  1. 若是這個工程沒有編譯過,那麼咱們的全部C文件都要編譯並被連接。
  2. 若是這個工程的某幾個C文件被修改,那麼咱們只編譯被修改的C文件,並連接目標程。
  3. 若是這個工程的頭文件被改變了,那麼咱們須要編譯引用了這幾個頭文件的C文件,並連接目標程序。

學會編寫Makefile,不單單有益於你在Linux下編寫大型工程。同時也能幫助你理解編譯原理。遠離IDE,瞭解編譯過程。markdown

廢話少說,Makefile其實最主要的語法只有一句:ui

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

target就是目標文件,prerequisites表示全部生成目標文件所需的擁有依賴關係的文件。command就是由依賴文件生成目標文件的編譯命令。
因此,對於單個的.c文件,一個最最簡單的Makefile以下:spa

object: main.c
    gcc -o object main.c

固然,對於單個C文件使用Makefile幾乎沒有意義。
下面來看一個稍複雜一點兒的Makefile文件:code

DIR=./
object: main.o 1.o 2.o 
    gcc -o object main.o 1.o 2.o
1.o: 1.c my.h
    gcc -c 1.c
2.o: 2.c my.h
    gcc -c 2.c
main.o: main.c my.h
    gcc -c main.c

.PHONY: clean

clean: 
    rm $(DIR).o object

這是一個稍有實用價值的Makefile,工程由四個源文件構成:my.h 1.c 2.c main.c。
放在最前面的字符串

DIR=./

是變量定義。Makefile中的的變量定義多爲字符串,主要目的是爲了不重複長字符串輸入。
1.o 2.o main.o 分別是三個源文件生成的連接文件。若是你不知道連接文件是什麼。。。。找度娘吧。。
首先第一個target通常爲最終目標文件,以後的target通常爲過程文件。
.PHONY是用來定義僞目標用的。僞目標不是實際要生成的文件,通常爲make命令帶入的參數。例如上面文件中的clean,其對應的命令爲清除全部中間文件以及最後的目標文件。
其實,通常不定義僞目標也是OK的,可是一旦目錄下出現了和僞目標重名的文件。這時候Makefile執行僞目標命令就會出錯。由於Makefile不知道這是僞目標,而僞目標又沒有依賴文件,因此Makefile會跳過僞目標文件對應的命令。get

以上,是對Makefile的一個簡單入門介紹,通常,用以閱讀大多數的Makefile都已經足夠了。深究請百度或者Google。it

版權聲明:本文爲博主原創文章,未經博主容許不得轉載。編譯

相關文章
相關標籤/搜索