2014-10-07 68 views
3

我有一個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)'?

+0

這條線很奇怪......而且很可能是錯的。 '-o'可能會吞噬'$(CPPFLAGS)'中的第一個參數,除非'g ++'參數解析非常聰明。 – 2014-10-07 03:34:38

+1

@EtanReisner:確實是錯的;但無害,因爲它只是吞下第一個包含目錄,這不需要鏈接。 – 2014-10-07 03:38:56

+0

@MikeSeymour:但是它不會吞噬第一個目錄,就像您從輸出中看到的一樣。 – 2014-10-07 06:31:57

回答

6

此生成文件使用implicit rules來編譯源文件。規則:

$(BIN): $(OBJS) 

詢問對象文件OBJS,並已經知道如何建立VocabLearn.o如果有文件VocabLean.cpp

+0

所以隱式規則也可以包含所需的目錄並鏈接需要的.obj文件,對吧? – 2014-10-07 06:27:27

+0

@NothingMore:是的,編譯C++的隱式規則將在編譯器標誌中包含'$(CPPFLAGS)'。 – 2014-10-07 06:39:24

0

基本上有一個隱式的規則來將* .cpp文件轉換爲* .o文件,但是您必須將* .o作爲依賴項放在您的目標中。在給定的Makefile中,VocabLearn.o作爲$(BIN)的依賴項。因此,VocabLearn.o會從VocabLearn.cpp文件中自動生成。

相關問題