makefile中的目標的依賴該怎麼寫?

注意,這篇博文

並不是makefile的教程!

並不是makefile的教程!

並不是makefile的教程!

僅僅是在學習makefile過程中關於如何寫依賴的一個感悟。

makefile的學習文檔可參考:

http://download.csdn.net/detail/gmpy_tiger/9568503


簡要說下makefile的一個基本格式:

目標:依賴文件(目標)

【tab】命令

“目標” :是你要生成的或操作的命令的索引

“依賴” :是生成目標依賴的文件或目標【依賴文件的任一處改動,將導致已存在的目標文件過期】

“命令” :是爲了生成目標的給shell執行的命令


需要注意的是,依賴的作用:

【依賴文件的任一處改動,將導致已存在的目標文件過期】

【依賴文件的任一處改動,將導致已存在的目標文件過期】

【依賴文件的任一處改動,將導致已存在的目標文件過期】

簡單來說:

依賴的作用就是決定目標是否過期,是否需要重新編譯。

舉個例子:

#include <stdio.h>
#include "mylib1.h"
#include "mylib2.h"

int main(int argc, char argv[]){
    printf("hello world!\n");
}
我的makefile可以寫成

helloworld : stdio.h mylib1.h mylib2.h other.o

    gcc -o helloworld helloworld.c

也可以寫成

helloworld : other.o

    gcc -o helloworld helloworld.c

前者希望在stdio.h mylib1.h,mylib2.h,other.o 改變的時候重新編譯helloworld.c,後者希望僅僅在other.o改變的時候重新編譯helloworld.c。

因此,

你想helloworold在什麼改變的時候重新編譯,就把什麼寫在依賴裏。這就是依賴,並不死板的規定所有頭文件必須寫在依賴裏。(不過一般而言,爲了目標能正常執行,都希望自己寫得頭文件發生了改變,重新編譯目標)

========================================================================================

依賴的另外一個常做用途是:執行指定的目標

例如:

.PHONY: all

all : helloworld clean

helloworld:helloworld.o

    gcc helloworld.o -o helloworld

helloworld.o:

    gcc -c helloworld.c

clean:

    rm helloworld.o

all作爲終極目標(即makefile的最上面的第一個目標),依賴helloworld和clean,因此,執行生成all目標前(實際上由於all目標沒有命令,因此在處理完依賴後直接退出,並沒有all生成),會先執行helloworld和clean目標。

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