makefile檔案由make命令執行。這個檔案裡面有一個工程的編譯規則,先編譯那個檔案,編譯順序,在很多IDE下可以自己完成。這裡只是簡單介紹,詳細內容:http://www.chinaunix.net/old_jh/23/408225.html
規則:目標:依賴
命令
連結外部庫,就算在開始聲明了math.h函數不會載入libmath.a庫,只有在編譯時間加入
gcc -g -Wall hellomath.c -lm -o math -lm是-libm.a簡寫。
Make憑藉本身的優勢,可在所有的 Unix系統中被找到。要瞭解關於Gnu
make的更多資訊,請參考 Richard M. Stallman和 Roland McGrath編寫的GNU
Make手冊。 Make 從makefile(預設是目前的目錄下的名為‘Makefile’的檔案)中讀取項目的描述。makefile指定了一系列目標(比如可執行檔)和依賴(比如對象檔案和源檔案)的編譯規則,其格式如下:
目標:依賴
命令
對每一個目標,make檢查其對應的依賴檔案修改時間來確定該目標是否需要利用對應的命令重建立立。注意到,makefile中命令行必須以單個的TAB字元進行縮排,不能是空格。
GNU Make 包含許多預設的規則(參考隱含規則)來簡化makefile的構建。比如說,它們指定‘.o’檔案可以通過編譯‘.c’檔案得到,可執行檔可以通過將‘.o’連結到一起獲得。隱含規則通過被叫做make變數的東西所指定,比如CC(C語言編譯器)和CFLAGS(C程式的編譯選項);在makefile檔案中它們通過獨佔一行的變數=值的形式被設定。對C++,其等價的變數是CXX和CXXFLAGS,而變數CPPFLAGS則是編譯預先處理選項。
現在我們為上一節的項目寫一個簡單的 makefile 檔案:
CC=gcc
CFLAGS=-Wall
hello: hello.ohello_fn.o
clean:
rm -f hello hello.o hello_fn.o
該檔案可以這樣來讀:使用 C 語言編譯器gcc,和編譯選項‘-Wall’,從對象檔案‘hello.o’和‘hello_fn.o’產生目標可執行檔hello(檔案‘hello.o’和‘hello_fn.o’通過隱含規則分別由‘hello.c’和‘hello_fn.c’產生)。目標clean沒有依賴檔案,它只是簡單地移除所有編譯產生的檔案。rm命令的選項
‘-f’(force) 抑制檔案不存在時產生的錯誤訊息。
另外,需要注意的是,如果包含main函數的cpp檔案為A.cpp, makefile中最好把可執行檔名也寫成 A。
要使用該 makefile 檔案,輸入make。不加參數調用make時,makefile檔案中的第一個目標被建立,從而產生可執行檔‘hello’:
$ make
gcc -Wall -c -o hello.o hello.c
gcc -Wall -c -o hello_fn.o hello_fn.c
gcc hello.o hello_fn.o -o hello
$ ./hello
Hello, world!
一個源檔案被修改要重建可執行檔,簡單地再次輸入make即可。通過檢查目標檔案和依賴檔案的時間戳記,程式
make可識別哪些檔案已經修改並依據對應的規則更新其對應的目標檔案:
$ vim hello.c (開啟編輯器修改一下檔案)
$ make
gcc -Wall -c -o hello.o hello.c
gcc hello.o hello_fn.o -o hello
$ ./hello
Hello, world!最後,我們移除 make 產生的檔案,輸入 make clean:
$ make clean
rm -f hello hello.o hello_fn.o一個專業的 makefile檔案通常包含用於安裝(make install)和測試(makecheck)等額外的目標。
本文中涉及到的例子都足夠簡單以至於可以完全不需要makefile,但是對任何大些的程式都使用 make 是很有必要的。