Нет правила, чтобы сделать цель .o, почему? - PullRequest
0 голосов
/ 02 июня 2018

Это первый сборочный файл в моей жизни!У меня есть проект, в котором у меня есть папка src (в которой я храню мои файлы .cpp), папка include (в которой я храню мои файлы .hpp) и build папка, в которой я хотел бы хранить свои объектные файлы.

 # define the C compiler to use
CCXX = g++ -std=c++11

# define any compile-time flags
CXXFLAGS = -g -Wall

# define any directories containing header files other than /usr/include
INCLUDES = -I./include

#define the directory for src files
SRCDIR = ./src/

#define the directive for object files
OBJDIR = ./build/

# define the C source files
SRCS = action.cpp conditionedBT.cpp control_flow_node.cpp execution_node.cpp main.cpp

# define the C object files 
OBJS = $(OBJDIR)$(SRCS:.cpp=.o)

# define the executable file 
MAIN = out

.PHONY: depend 

all: $(MAIN)
    @echo Program compiled

$(MAIN): $(OBJS) 
    $(CCXX) $(CXXFLAGS) $(INCLUDES) -o $(MAIN) $(OBJS)

$(OBJDIR)/%.o: ($SRCDIR)/%.c
    $(CCXX) $(CXXFLAGS) $(INCLUDES) -c -o $@ $<
#.c.o:
#   $(CC) $(CFLAGS) $(INCLUDES) -c $<  -o $@
#clean:
#   $(RM) *.o *~ $(MAIN)

depend: $(addprefix $(SRCDIR),$(SRCS))
    makedepend $(INCLUDES) $^

# DO NOT DELETE THIS LINE -- make depend needs it

Учитывая вышесказанное, я получаю следующую ошибку при попытке выполнить make:

make: *** No rule to make target `build/action.o', needed by `out'.  Stop.

1 Ответ

0 голосов
/ 02 июня 2018

Есть несколько проблем с вашим 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...