2014-11-06 50 views
1

我應該說這是說我對Makefiles很新。使執行不正確的Makefile

我創建下面的Makefile:

all: tiling_graph.o 
     g++ -o tiling_graph tiling_graph.o -L/usr/local/lib -ligraph 

我想確保-ligraph是包括在內。但是,當我輸入「make」時,我得到以下輸出:「C++ -c -o tiling_graph.o tiling_graph.cpp」

爲什麼它不使用我在當前目錄中創建的Makefile?我曾嘗試使用「make -f Makefile」和「make -file = Makefile」,但這些都不起作用。

另外,在我第一次創建Makefile後,它正常工作。鍵入make後的輸出爲 「g ++ -o tiling_graph tiling_graph.o -L/usr/local/lib -ligraph」

我執行./tiling_graph並且成功。

然後我編輯了tiling_graph.cpp,再次運行make,輸出結果爲「C++ -c -o tiling_graph.o tiling_graph.cpp」,並一直保持。

我真的很感激任何幫助。謝謝!

+0

通過查看[this example](http://stackoverflow.com/a/20146082/841108)來改進您的'Makefile' – 2014-11-06 05:59:57

回答

2

一個簡單的方法去思考一個規則來實現:

target: dependency list 
     commands to make the target 

是,它是從依賴關係列表中的文件列表進行所謂target文件的配方。由於make可以看到文件系統,因此它可以判斷依賴列表中的任何文件是否比名爲target的文件更新,這是其重新創建target的信號。畢竟,如果沒有依賴關係發生變化,那麼目標必須是最新的。

請注意,make知道很多關於如何構建文件。特別是,它有很多內置的「模式」規則,因此它知道如何從C++源文件(prog.cpp)或C源文件(prog.c)或者C源代碼文件(prog.o)或許多其他的事情。所以你只需要在你有其他需求的時候寫一個makefile,比如一個庫(甚至你可以把它添加到一個環境變量中,但是makefile更好)。

現在,您實際上並不想生成名爲all的文件。你想建立一個名爲tiling_graph的文件。所以,正確的化妝規則是:

tiling_graph: tiling_graph.o 
     g++ -o tiling_graph tiling_graph.o -L/usr/local/lib -ligraph 

由於make已經知道如何創建tiling_graph.o,它實際上可以弄清楚如何從tiling_graph.cpp使tiling_graph

那麼all從哪裏來?使用all通常的方法是:

all: program1 program2 program3 

all目標要求program1program2program3告訴make。因此,如果您需要構建所有這三個程序,則all規則將允許您執行一條make命令。由於沒有文件名爲all,這是一個「假」的目標,並(與GNU make,應至少)應當聲明爲假目標:

all: tiling_graph 
.PHONY: all 

但是,你真的不需要,如果你只是想要建立一個程序。

當您只鍵入make(而不是make target)時,make選擇makefile中的第一個目標。所以如果你把你通常想要建立的東西放在第一位,那麼你可以節省一些打字。