2012-04-22 90 views
0

我有以下生成文件源文件沒有被使用編譯makefile規則

CXX  = g++ 
CXXFLAGS = -c -g -pg -Wall -Wextra 
LINK  = g++ 
TARGET = ../../Binaries/tests 
SOURCES := ../Src/$(wildcard *.cpp) 
OBJS_DIR := ../Objects 
OBJS  = $(sort $(patsubst %.cpp, $(OBJS_DIR)/%.o, $(patsubst %.c, $(OBJS_DIR)/%.o, $(notdir $(SOURCES))))) 

tests: $(TARGET) 

$(TARGET): $(OBJS) 
    $(LINK) $? -o [email protected] 

$(OBJS): $(SOURCES) 
    $(CXX) $(CXXFLAGS) $? -o [email protected] 

其中,使用運行時make tests(或只是簡單地make),給出了以下的輸出:

g++ -o ../../Binaries/tests 
g++: fatal error: no input files 
compilation terminated. 
make: *** [../../Binaries/tests] Error 4 

這似乎對我來說,正在嘗試鏈接文件(還不存在),而不檢查$(OBJS)的規則。我的目標是擁有一個完全自給自足的Makefile,能夠在../Src中找到*.cpp文件,在../Objects中找到*.o文件(它將生成itsef),但是我寫的規則doesn似乎沒有這樣的工作方式。任何人都可以告訴我我哪裏出了問題嗎?

回答

0

最有可能的問題是以下行:

SOURCES := ../Src/$(wildcard *.cpp) 

它應該是這樣,而不是:

SOURCES := $(wildcard ../Src/*.cpp) 

而且轉化來源爲對象可以被改寫爲:

OBJS  := $(SOURCES:../Src/%.cpp=$(OBJS_DIR)/%.o) 

最後編譯規則通常通過實現:

$(OBJS_DIR)/%.o : ../Src/%.cpp 
    $(CXX) $(CXXFLAGS) $< -o [email protected]