GNU Make a completely different result

This is confusing. I have a Makefile:

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 $@ $^ # Build source files define compile_rule %.o : %.$1 $$(COMPILE) $$(COMPILE_FLAGS) $$(CC_FLAGS) -o $$@ $$< 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) 

it compiled successfully at first, but then it stopped for no reason, and this was the result:

 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. 

the problem was, I didn’t even tell her to use β€œC ++” in the Makefile, but instead of β€œg ++”. Also, when I cleared CC_FLAGS , -c was still there. It is like Make, having your own mind.

If I use make print to print my variables, this looks fine:

 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 

Any help or advice would be appreciated. Thanks!

Update

I updated my print to print the expected execution of the compilation:

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

Result:

 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 

This proves that make knows what I wanted, but when he builds it in a completely different way: c++ instead of g++ ?!

Update 2:

c++ calls clang installed on my system.

Alex B Solution:

But from the compilation command line, it looks like Make tries to use an implicit suffix rule and ignores your template rule.

I tried .SUFFIXES: and yes, it reported a missing rule. Thank you, I will go and consult with the management.

+8
c ++ g ++ makefile
source share
1 answer

As I said in the commentary, it works in my environment (Mac OSX, GNU Make 3.81), so the problem may be that the makefile you created is incomplete or you are using a different version of Make.

But from the compilation command line, it looks like this: Make tries to use an implicit suffix rule and ignores your template rule.

You can tell Make to ignore the default rules by specifying an empty list of suffixes so that you can debug your problem further.

 .SUFFIXES: 
+2
source share

All Articles