我有一個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++手段鐺編譯器)
C++ -I ../ LIB/ann_1.1 /包含/ ANN -I ../ LIB/ann_1.1_char /包含/ 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-循環-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)
爲什麼會出現「-o」前「 $(CPPFLAGS)'?
這條線很奇怪......而且很可能是錯的。 '-o'可能會吞噬'$(CPPFLAGS)'中的第一個參數,除非'g ++'參數解析非常聰明。 – 2014-10-07 03:34:38
@EtanReisner:確實是錯的;但無害,因爲它只是吞下第一個包含目錄,這不需要鏈接。 – 2014-10-07 03:38:56
@MikeSeymour:但是它不會吞噬第一個目錄,就像您從輸出中看到的一樣。 – 2014-10-07 06:31:57