2011-03-30 74 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你的情况更换)