教會你如何編寫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中間件 條碼系統中間層 物聯網軟件集成