教會你如何編寫makefile檔案

來源:互聯網
上載者:User

標籤: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 命令

 

執行過程
  1. 編譯器將會編譯你的源檔案,然後輸出目標檔案
  2. 連結器執行目標檔案然後建立一個可執行檔。
手動編譯   

最不理想的一種執行方式就是

 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]
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.