2011-03-30 53 views
-1

我是「Make」的新手。關於下面的Makefile:如何理解這個Makefile?

CXX ?= g++ 
CFLAGS = -Wall -Wconversion -O3 -fPIC 
SHVER = 2 

all: svm-train svm-predict svm-scale 

lib: svm.o 
    $(CXX) -shared -dynamiclib svm.o -o libsvm.so.$(SHVER) 

svm-predict: svm-predict.c svm.o 
    $(CXX) $(CFLAGS) svm-predict.c svm.o -o svm-predict -lm 
svm-train: svm-train.c svm.o 
    $(CXX) $(CFLAGS) svm-train.c svm.o -o svm-train -lm 
svm-scale: svm-scale.c 
    $(CXX) $(CFLAGS) svm-scale.c -o svm-scale 
svm.o: svm.cpp svm.h 
    $(CXX) $(CFLAGS) -c svm.cpp 
clean: 
    rm -f *~ svm.o svm-train svm-predict svm-scale libsvm.so.$(SHVER) 

如何理解這個Makefile的流程?例如,「all」和「lib」在這裏做什麼?如何分析

$(CXX) -shared -dynamiclib svm.o -o libsvm.so.$(SHVER) 
+1

一些本已涵蓋在你前面的問題:HTTP:// stackoverfl ow.com/questions/5487833/questions-on-makefile-cflags-and-shver – 2011-03-30 21:10:59

+1

嘗試閱讀教程或手冊。 – eriktous 2011-03-30 23:45:24

回答

0

每個make規則以相同的方式工作。如果任何依賴項(:右側的值)過期,則會重建它們,然後運行規則的配方。在這種情況下,all目標沒有配方,因此make只檢查相關性(svm-train,svm-predictsvm-scale),並在它們過期時構建它們。

lib目標是相似的 - 如果它是過時的svm.o建成,然後配方

$(CXX) -shared -dynamiclib svm.o -o libsvm.so.$(SHVER) 

運行。由於這是您問到的關於分析的行,因此$(CXX)$(SHVER)make變量,它們將按照前面的定義進行填充。在你的情況下,$(CXX)g++$(SHVER)2。該命令將獲得運行是:

g++ -shared -dynamiclib svm.o -o libsvm.so.2 

至少假設你沒有定義$(CXX)別處 - 用來做如果變量尚未定義的分配只能在?=操作。

當您在命令行鍵入make時,您應該在標準輸出執行時看到每個命令。您可以使用make -dmake -n獲取更多調試/日誌信息。

GNU make manual寫得非常好,是恕我直言,是網上最棒的編程資源之一。

3

如果鍵入

$ make all 

將建立所有的事情的all :的權利,如SVM-火車,SVM-預測和SVM-規模

$(CXX) -shared -dynamiclib svm.o -o libsvm.so.$(SHVER) 

是構建目標庫的具體規則,它將轉化爲

g++ -shared -dynamiclib svm.o -o libsvm.so.2 

取決於變量CXX和SHVER的值。

1

目標alllib的行被稱爲依賴項

目標all取決於目標svm-trainsvm-predictsvm-scale

目標lib取決於lib.o

遵循所有這些依賴關係,然後決定需要執行哪些構建命令。

如果你鍵入讓所有然後做會盡量確保目標svm-trainsvm-predictsvm-scale都是最新的。 make會遞歸地檢查這些目標的依賴關係,直到它耗盡所有的依賴關係。

0

all觸發器可以解決所有的依賴關係(訪問中提到的觸發器):svm-trainsvm-predictsvm-scale

現在,每個觸發器的運行,像腳本,意思是:編譯svm.o,使用CXX與聲明的編譯器標誌-shared-dynamiclib,outputing名爲libsvm.so.$(SHVER)的文件(其中$(SHVER)將與2你的情況更換)