2012-12-20 35 views
8

这是令人困惑的。我有我的Makefile:GNU产生完全不同的结果

OBJECTS = 
INCLUDE_BUILD_PATH = /Users/wen/Projects/include 

# Change compilation settings here 
COMPILE = g++ 
override COMPILE_FLAGS += -O2 

# Change linker/compiler specific settings here 
LD_FLAGS := 
CC_FLAGS := -c -I$(INCLUDE_BUILD_PATH)/bigint 

# Add source extensions here 
SRC_EXT = cpp cc 

# Add header dependencies here 
HEADERS = $(wildcard *.hpp) $(wildcard $(INCLUDE_BUILD_PATH)/*/*.hh) 

# Add source files here 
CC_FILES = $(wildcard *.cpp) $(wildcard $(INCLUDE_BUILD_PATH)/*/*.cc) 
CC_O_BUFFER = $(CC_FILES) 
CC_O_BUFFER := $(CC_O_BUFFER:.cpp=.o) 
CC_O_BUFFER := $(CC_O_BUFFER:.cc=.o) 
OBJECTS = $(CC_O_BUFFER) 

# Change .exe name here 
EXE_NAME = maketest 

# Link object files 

$(EXE_NAME): $(OBJECTS) 
    $(COMPILE) $(COMPILE_FLAGS) $(LD_FLAGS) -o [email protected] $^ 

# Build source files 

define compile_rule 
%.o : %.$1 
     $$(COMPILE) $$(COMPILE_FLAGS) $$(CC_FLAGS) -o [email protected] $$< 
endef 
    $(foreach EXT,$(SRC_EXT),$(eval $(call compile_rule,$(EXT)))) 

# Clean 

clean: 
    rm -f $(OBJECTS) $(EXE_NAME) 

# Debug Build 

debug: 
    @echo "Rerun with COMPILE_FLAGS=-D_DEBUG" 

# Print variables 

print: 
    @echo $(CC_FILES) 
    @echo $(OBJECTS) 
    @echo $(HEADERS) 

它首先编译成功,但随后无缘无故拦,这是输出:

Yoshi-Air:maketest wen$ make 
c++ -c -o maketest.o maketest.cpp 
maketest.cpp:4:10: fatal error: 'BigIntegerLibrary.hh' file not found 
#include "BigIntegerLibrary.hh" 
     ^
1 error generated. 

的问题是,我甚至没有告诉它在Makefile中使用“C++”,而使用“g ++”。另外,当我清除CC_FLAGS-c仍然存在。这就像Make有自己的想法。

如果我使用make print打印出我的变量,它似乎是没事:

maketest.cpp /Users/wen/Projects/include/bigint/BigInteger.cc /Users/wen/Projects/include/bigint/BigIntegerAlgorithms.cc /Users/wen/Projects/include/bigint/BigIntegerUtils.cc /Users/wen/Projects/include/bigint/BigUnsigned.cc /Users/wen/Projects/include/bigint/BigUnsignedInABase.cc 
maketest.o /Users/wen/Projects/include/bigint/BigInteger.o /Users/wen/Projects/include/bigint/BigIntegerAlgorithms.o /Users/wen/Projects/include/bigint/BigIntegerUtils.o /Users/wen/Projects/include/bigint/BigUnsigned.o /Users/wen/Projects/include/bigint/BigUnsignedInABase.o 
maketest.hpp /Users/wen/Projects/include/bigint/BigInteger.hh /Users/wen/Projects/include/bigint/BigIntegerAlgorithms.hh /Users/wen/Projects/include/bigint/BigIntegerLibrary.hh /Users/wen/Projects/include/bigint/BigIntegerUtils.hh /Users/wen/Projects/include/bigint/BigUnsigned.hh /Users/wen/Projects/include/bigint/BigUnsignedInABase.hh /Users/wen/Projects/include/bigint/NumberlikeArray.hh 

任何帮助或建议将不胜感激。谢谢!

更新

我更新了我的print打印编译的预期执行:

print: 
    @echo $(CC_FILES) 
    @echo $(OBJECTS) 
    @echo $(HEADERS) 
    @echo "Compiles with:" 
    @echo $(COMPILE) $(COMPILE_FLAGS) $(LD_FLAGS) $(CC_FLAGS) 

结果:

maketest.cpp /Users/wen/Projects/include/bigint/BigInteger.cc /Users/wen/Projects/include/bigint/BigIntegerAlgorithms.cc /Users/wen/Projects/include/bigint/BigIntegerUtils.cc /Users/wen/Projects/include/bigint/BigUnsigned.cc /Users/wen/Projects/include/bigint/BigUnsignedInABase.cc 
maketest.o /Users/wen/Projects/include/bigint/BigInteger.o /Users/wen/Projects/include/bigint/BigIntegerAlgorithms.o /Users/wen/Projects/include/bigint/BigIntegerUtils.o /Users/wen/Projects/include/bigint/BigUnsigned.o /Users/wen/Projects/include/bigint/BigUnsignedInABase.o 
maketest.hpp /Users/wen/Projects/include/bigint/BigInteger.hh /Users/wen/Projects/include/bigint/BigIntegerAlgorithms.hh /Users/wen/Projects/include/bigint/BigIntegerLibrary.hh /Users/wen/Projects/include/bigint/BigIntegerUtils.hh /Users/wen/Projects/include/bigint/BigUnsigned.hh /Users/wen/Projects/include/bigint/BigUnsignedInABase.hh /Users/wen/Projects/include/bigint/NumberlikeArray.hh 
Yoshi-Air:maketest wen$ make print 
maketest.cpp /Users/wen/Projects/include/bigint/BigInteger.cc /Users/wen/Projects/include/bigint/BigIntegerAlgorithms.cc /Users/wen/Projects/include/bigint/BigIntegerUtils.cc /Users/wen/Projects/include/bigint/BigUnsigned.cc /Users/wen/Projects/include/bigint/BigUnsignedInABase.cc 
maketest.o /Users/wen/Projects/include/bigint/BigInteger.o /Users/wen/Projects/include/bigint/BigIntegerAlgorithms.o /Users/wen/Projects/include/bigint/BigIntegerUtils.o /Users/wen/Projects/include/bigint/BigUnsigned.o /Users/wen/Projects/include/bigint/BigUnsignedInABase.o 
maketest.hpp /Users/wen/Projects/include/bigint/BigInteger.hh /Users/wen/Projects/include/bigint/BigIntegerAlgorithms.hh /Users/wen/Projects/include/bigint/BigIntegerLibrary.hh /Users/wen/Projects/include/bigint/BigIntegerUtils.hh /Users/wen/Projects/include/bigint/BigUnsigned.hh /Users/wen/Projects/include/bigint/BigUnsignedInABase.hh /Users/wen/Projects/include/bigint/NumberlikeArray.hh 
Compiles with: 
g++ -O2 -c -I/Users/wen/Projects/include/bigint 

这证明,让知道我想要的东西,但是当它建立它完全不同:c++而不是g++?!

更新2:

c++调用铛,安装在我的系统上。

解决方案由Alex B:

但是从编译命令行,它看起来像提出的是试图 使用隐式后缀规则,而忽略你的方式规则。

我试过.SUFFIXES:,是的,它报告没有发现规则。谢谢,我会去参考手册。

+0

我的建议是?检查是否存在“BigIntegerLibrary.hh”。 –

+0

多次告诉我这件事;它确实存在。问题在于make没有正确地包含CC_FLAGS以将包含路径传递给编译器。 –

+0

哦。所以,让我们看看... –

回答

2

正如我在评论中所述,它适用于我的环境(Mac OSX,GNU Make 3.81),所以问题可能是您发布的生成文件不完整,或者您使用的是不同版本的Make。

但是从编译命令行看起来Make是试图使用隐式后缀规则,并且忽略了您的模式规则。

您可以通过指定一个空的后缀列表来告诉Make忽略默认规则,以便您可以进一步调试您的问题。

.SUFFIXES: 
+0

“但是从编译命令行看起来Make是试图使用隐式后缀规则,而忽略了你的模式规则。”这完全解释了它。我会研究它。 –

+0

我可以+10你的答案,我可以:D –

相关问题