教會你如何編寫makefile文件
最近一直在學習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.o g++ main.o factorial.o hello.o -o hello main.o: main.cpp g++ -c main.cpp factorial.o: factorial.cpp g++ -c factorial.cpp hello.o: hello.cpp g++ -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.o all: 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 -Wall LDFLAGS= SOURCES=main.cpp hello.cpp factorial.cpp OBJECTS=$(SOURCES:.cpp=.o) EXECUTABLE=hello all: $(SOURCES) $(EXECUTABLE) $(EXECUTABLE): $(OBJECTS) $(CC) $(LDFLAGS) $(OBJECTS) -o $@ .cpp.o: $(CC) $(CFLAGS) {1}lt; -o $@RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成