Makefile没有指定源文件

时间:2014-10-07 03:24:48

标签: c++ makefile

我有一个makefile,如下所示:

# Makefile for VocabLearn

MACHTYPE=$(shell uname -m)

GCC         = g++

CC=gcc
# OPTFLAGS=-g2
OPTFLAGS=-O3 -ffast-math -Wall -mfpmath=sse -msse2 -funroll-loops -march=core2
OTHERFLAGS=-Wall -fopenmp

INCLUDE_PATH=-I../lib/ann_1.1/include/ANN -I../lib/ann_1.1_char/include/ANN \
    -I../lib/imagelib -I../VocabLib -I../lib/zlib/include
LIB_PATH=-L../lib -L../VocabLib -L../lib/zlib/lib

OBJS=VocabLearn.o

LIBS=-lvocab -lANN -lANN_char -limage -lz

CPPFLAGS=$(INCLUDE_PATH) $(LIB_PATH) $(OTHERFLAGS) $(OPTFLAGS)

BIN=VocabLearn

all: $(BIN)

$(BIN): $(OBJS)
    g++ -o $(CPPFLAGS) -o $(BIN) $(OBJS) $(LIBS)

clean:
    rm -f *.o *~ $(LIB)

当我在提示中“制作”时,它工作正常并输出以下信息:(我使用的是Mac OS,c ++表示clang编译器)

  

c ++ -I ../ lib / ann_1.1 / include / ANN -I ../ lib / ann_1.1_char / include / ANN   -I ../ lib / imagelib -I ../ VocabLib -I ../ lib / zlib / include -L ../ lib -L ​​../ VocabLib -L ​​../ lib / zlib / lib -Wall -fopenmp -O3 -ffast-math -Wall -mfpmath = sse -msse2 -funroll-loops -march = core2 -c -o VocabLearn.o VocabLearn.cpp

     

g ++ -o -I ../ lib / ann_1.1 / include / ANN -I ../ lib / ann_1.1_char / include / ANN   -I ../ lib / imagelib -I ../ VocabLib -I ../ lib / zlib / include -L ../ lib -L ​​../ VocabLib -L ​​../ lib / zlib / lib -Wall -fopenmp -O3 -ffast-math -Wall -mfpmath = sse -msse2 -funroll-loops -march = core2 -o VocabLearn VocabLearn.o -lvocab -lANN -lANN_char -limage -lz

我只是想知道这个makefile是如何工作的。如您所见,由于此makefile未指定要编译的源代码,编译器如何知道它应该处理的是“VocabLearn.cpp”? (我的猜测是它将根据目标文件的名称搜索源文件,VocabLearn.o)这条线对我来说似乎有点奇怪:

g++ -o $(CPPFLAGS) -o $(BIN) $(OBJS) $(LIBS)

为什么'$(CPPFLAGS)'之前有'-o'?

2 个答案:

答案 0 :(得分:6)

这个makefile正在使用implicit rules来编译源文件。规则:

$(BIN): $(OBJS)

请求OBJS中的目标文件,如果有文件VocabLearn.o,则make已经知道如何构建VocabLean.cpp

答案 1 :(得分:0)

基本上有一个隐式规则可以将* .cpp文件转换为* .o文件,但是你必须在一个目标中使用* .o作为依赖项。在给定的Makefile中,您将VocabLearn.o作为$(BIN)的依赖项。因此,VocabLearn.o从VocabLearn.cpp文件中自动生成。

相关问题