我有一个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)
Run Code Online (Sandbox Code Playgroud)
当我在提示中'make'时,它工作正常并输出以下信息:(我使用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)
Run Code Online (Sandbox Code Playgroud)
为什么'$(CPPFLAGS)'之前有'-o'?
此makefile使用隐式规则来编译源文件.规则:
$(BIN): $(OBJS)
Run Code Online (Sandbox Code Playgroud)
要求输入目标文件OBJS
,并且VocabLearn.o
如果有文件,make已经知道如何构建VocabLean.cpp
.