Есть несколько проблем с вашим Makefile
.
1) Вы используете расширение .c
, когда ваши файлы используют .cpp
.
2) Ваша директива по подстановке OBJS = $(SRCS:.c=.o)
не учитывает подкаталоги ваших источников и объектов.
3) Ваше общее правило делать объекты невызывается по этим причинам, а также потому, что вы не указываете подкаталог источников.
Из-за этого make
создает свои собственные правила для компиляции вашего объекта и игнорирует созданное вами правило.
Также я бы порекомендовал использовать правильные неявные переменные для C++
, что улучшило бы работу неявных правил.
Они подробно описаны здесь: https://www.gnu.org/software/make/manual/html_node/Implicit-Variables.html
Поэтому я бы порекомендовалчто-то вроде этого:
# define the C compiler to use
CXX = g++
# define any compile-time flags
CXXFLAGS = -std=c++11 -g -Wall
# define any directories containing header files other than /usr/include
CPPFLAGS = -I./include
#define the directive for object files
OBJDIR = ./build
SRCDIR = ./src
# define the C source files
SRCS = $(SRCDIR)/action.cpp $(SRCDIR)/main.cpp
# define the C object files
OBJS = $(patsubst $(SRCDIR)/%.cpp,$(OBJDIR)/%.o,$(SRCS))
# define the executable file
MAIN = out
.PHONY: depend
all: $(MAIN)
@echo Program compiled
$(MAIN): $(OBJS)
$(CXX) $(CXXFLAGS) $(CPPFLAGS) -o $(MAIN) $(OBJS)
$(OBJDIR)/%.o: $(SRCDIR)/%.cpp
@echo "Compiling: " $@
$(CXX) $(CXXFLAGS) $(CPPFLAGS) -c -o $@ $<
clean:
$(RM) $(OBJDIR)/*.o *~ $(MAIN)
depend: $(SRCS)
makedepend $(INCLUDES) $^
# DO NOT DELETE THIS LINE -- make depend needs it