標籤:class code tar com get 使用
最近一直在學習makefile是如何編寫的。當我們寫的程式檔案比較少的時候,敲入gcc /g++,當你在大型工程中,在一個個編譯檔案的話,你可能就會很鬱悶。linux有一個內建的make命令,它讓你的工作省去了很大的力氣,但是你要學習如何編寫makefile檔案。
makefile是一種特殊的檔案格式,他將會幫你自動管理你的項目,很強大。 下面通過執行個體一步步講解如何使用makefile。下面的四段代碼。
//main.cpp #include "functions.h" int main() { print_hello(); cout << endl; cout << "The factorial of 5 is " << factorial(5) << endl; return 0; } //hello.cpp #include "functions.h" void print_hello() { cout << "Hello World!"; } ///factorial.cpp #include "functions.h" int factorial(int n) { if(n!=1) { return(n * factorial(n-1)); } else return 1; } //functions.h void print_hello(); int factorial(int n);
請將以上檔案放到一個目錄下。
請注意: 我用的是g++進行編譯的,你也可以按照你自己的選擇來編譯器
make的作用
如果你運行: make命令, 它將會自動的在你的目錄下尋找makefile檔案,然後執行它,如果你幾個makefile檔案,你可以指定某一個特定的makefile檔案 使用如下命令:
make -f mymakefile
如果你想知道更多的make 用法,可以執行man make 命令
執行過程
- 編譯器將會編譯你的源檔案,然後輸出目標檔案
- 連結器執行目標檔案然後建立一個可執行檔。
手動編譯
最不理想的一種執行方式就是
g++ main.cpp hello.cpp factorial.cpp -o hello
akefile 基本規則
makefile的基本規則是有以下構成:
target: dependencies
[tab] system command
利用以上文法編寫如下
all:
g++main.cpp hello.cpp factorial.cpp -o hello
然後運行你的makefile,如下
make -f Makefile-1
如上代碼敘述,所寫的目標是all,all是makefile預設的目標,如果沒有其他規定,make文法將要執行這個目標檔案。
我們還發現,all 目標並沒有依賴的,所以按照命令讓他安全的執行。
最後,make 通過 我們給的命令進行編譯器
使用依賴
這是因為,如果你修改一個單獨的檔案在你的項目,你不必重新編譯一切,只有你修改。 請看下邊的例子
all: hello hello: main.o factorial.o hello.og++ main.o factorial.o hello.o -o hello main.o: main.cppg++ -c main.cpp factorial.o: factorial.cppg++ -c factorial.cpp hello.o: hello.cppg++ -c hello.cpp clean:rm -rf *o hello
我們看到目標all 只有依賴,沒有系統命令。為了去執行正確,它必須滿足所有的目標所依賴的。目標都回去搜尋所有的依賴,然後去執行它。
在例子中,我們看到了clean的目標,clean 這個目標就是清楚中間產生的.o檔案和那些可執行檔
使用變數和注釋
當你寫makefil檔案的時候,當你想改變一些編譯的一些選項的時候,他是非常有用處的。
# 這是注釋,CC 編譯器. CC=g++# CFLAGS 是選項CFLAGS=-c -Wall# 目標檔案OBJECTS=main.o factorial.o hello.oall: hello hello: $(OBJECTS) $(CC) main.o factorial.o hello.o -o hello main.o: main.cpp$(CC) $(CFLAGS) main.cpp factorial.o: factorial.cpp$(CC) $(CFLAGS) factorial.cpp hello.o: hello.cpp$(CC) $(CFLAGS) hello.cpp clean:rm -rf *o hello
你可以看到,使用這些有時候是非常有用的。你可以使用它們,賦值,當你想改變一些變數值的時候,然後你可以使用$(var),
來應用這些變數
如何繼續下去
通過以上簡要的介紹,你就可以簡要的去編寫一些更加複雜的makefile來運行你的複雜的程式了。上邊講的只是冰山一角
,你可以通過差一些make的文檔來寫。
CC=g++CFLAGS=-c -WallLDFLAGS=SOURCES=main.cpp hello.cpp factorial.cppOBJECTS=$(SOURCES:.cpp=.o)EXECUTABLE=hello all: $(SOURCES) $(EXECUTABLE)$(EXECUTABLE): $(OBJECTS) $(CC) $(LDFLAGS) $(OBJECTS) -o [email protected] .cpp.o:$(CC) $(CFLAGS) {1}lt; -o [email protected]