注意,這篇博文
並不是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目標。