1

Я создал make-файл на основе GNU. Сделайте учебник: https://www.gnu.org/savannah-checkouts/gnu/make/manual/html_node/index.html#SEC_Contents.Сделать: круговая зависимость сброшена C++

Файл make отлично работает при первоначальном создании, но если файл был изменен, а make запущен, появляется сообщение об ошибке с циклической зависимостью, и он не создает измененный файл. Отброшенная зависимость - bin/main.o < -bin/main.o. Это имеет смысл как main.o не должно зависеть от main.o. Я искал несколько сайтов, включая stackoverflow и нашел полезные ответы, но я не смог решить проблему. Эти две ссылки были наиболее актуальными для моего вопроса: Makefile export .o file to a different path than .cpp и Makefile circular dependency error

На основе приведенной выше информации, которую я редактировал мой Makefile и по крайней мере, теперь я могу отлаживать проще. Проблема зависимости, вероятно, связана с последующей целью и обязательным условием после расширения подстановочных знаков, но я просто не вижу ее.

Вот мой Makefile:

#For compilation 

CC=g++ 
CC_FLAGS= -g -Wall -Werror -ansi -pedantic 

#make[1]: main.o all <- all 

#Folder structure 
BIN_DIR:=bin 
SRC_DIR:=src 
H_DIR:=src/header 

all:rshell 

#VPATH = $(SRC_DIR) 

H_FILES:=$(wildcard $(H_DIR)/*.h) 
DEPS:$(wildcard $(BIN_DIR)/*.d) 


CPP_FILES:=$(wildcard $(SRC_DIR)/*.cpp) 

OBJECTS := $(CPP_FILES:$(SRC_DIR)/%.cpp=$(BIN_DIR)/%.o) 

$(BIN_DIR)/%.o: $(SRC_DIR)/%.cpp $(H_DIR)/%.h 
    mkdir -p $(BIN_DIR) 
    $(CC) -I$(H_DIR) -o [email protected] -c $< $(CC_FLAGS) 

$(BIN_DIR)/main.o:$(SRC_DIR)/main.cpp $(OBJECTS) $(H_FILES) 
    $(CC) -I$(H_DIR) -o [email protected] -c $(SRC_DIR)/main.cpp $(CC_FLAGS) 

rshell: $(OBJECTS) 
    $(CC) -o $(BIN_DIR)/[email protected] $(OBJECTS) $(CC_FLAGS) 

include $(DEPS) 

$(MAKEFILE_LIST): ; 
%:: %,v 
%:: RCS/%,v 
%:: RCS/% 
%:: s.% 
%:: SCCS/s.% 

.PHONY: clean 

clean: 
    rm -rf $(BIN_DIR) 

Question1: Если расширение подстановочные вызывает циклическую зависимость, как я мог бы исправить?

Вопрос2: Как отслеживается расширение подстановочных знаков? Правильно ли было бы отгонять имена файлов и отслеживать их? Запуск make -d был полезен, но я не вижу, как его избежать. Мое предположение заключается в том, что эти линии вызывают круговые зависимости:

$(BIN_DIR)/main.o:$(SRC_DIR)/main.cpp $(OBJECTS) $(H_FILES) 
    $(CC) -I$(H_DIR) -o [email protected] -c $(SRC_DIR)/main.cpp $(CC_FLAGS) 

Благодарим за помощь и понимание.

ответ

0
$(BIN_DIR)/main.o:$(SRC_DIR)/main.cpp $(OBJECTS) $(H_FILES) 

На этой линии вы говорите построить main.o, мне нужно main.cpp * .h и * .o

Но * .o имеет main.o так вы пишете main.o зависит от main.o. Просто удалите $ (OBJECTS), вам не нужен объект для создания объекта.

$(BIN_DIR)/main.o:$(SRC_DIR)/main.cpp $(H_FILES) 

Не используйте подстановочный знак, лучше указывать исходные файлы. Не используйте CC для компилятора C++, стандартное использование CXX.

Exemple из Makefile:

NAME = foo 

CXX  ?= g++ 

RM  = rm 

DEBUG ?= no 

LEVEL ?= 3 

LIB  = -l m 

INCLUDE  = -I include 

CXXFLAGS += -Wall -Wextra -O$(LEVEL) 
CXXFLAGS += -ansi -pedantic -std=c++11 
CXXFLAGS += $(INCLUDE) 

ifeq ($(CXX), clang++) 
CXXFLAGS += -Weverything 
endif 

ifneq ($(DEBUG), no) 
CXXFLAGS += -g 
endif 

LDFLAGS  = $(LIB) 

ifeq ($(DEBUG), no) 
LDFLAGS  += -s 
endif 

SRC  = main.cpp 
SRC  += foo.cpp 

DPD  = $(SRC:.cpp=.dpd) 

OBJ  = $(SRC:.cpp=.o) 

all  : $(NAME) 

$(NAME) : $(OBJ) 
      $(CXX) $(OBJ) -o $(NAME) $(LDFLAGS) 

clean : 
      $(RM) -f $(OBJ) 
      $(RM) -f $(DPD) 

fclean : clean 
      $(RM) -f $(NAME) 

re  : fclean 
      $(MAKE) -C . 

%.dpd : %.cpp 
      $(CXX) -MM $(<) -o $(@) $(CXXFLAGS) -MT $(<:.cpp=.o) 

%.o  : %.cpp 
      $(CXX) -c $(<) -o $(@) $(CXXFLAGS) 

.PHONY  : all clean fclean re %.dpd %.o 

.SUFFIXES : .o.cpp .dpd.cpp 

include $(DPD) 
+0

Это зафиксировал его. Спасибо огромное! Итак, лучше ли явно указывать источники, если это возможно? Что обычно будет сделано, если имеется большое количество источников? Можно ли вызвать другой файл для создания других источников? – Program0

+0

Чтобы включить другой файл, вы можете использовать 'include sources.mk'. И вы можете использовать его для перегруппировки всех источников проекта [пример] (https://github.com/Stargateur/spider/blob/6e31676a092f7c0477be80cd4043dbfe84ed28b2/server.mk). Лучше выделять исходные файлы, потому что вы можете добавить временный файл cpp в свою папку или хотите сохранить исходный файл, но не использовать его в проекте. С помощью шаблона вы не можете выбрать файлы источников. Как и в файле cpp, вы не включаете каждый заголовок. В вашем файле Makefile вы не добавляете весь исходный файл: p – Stargateur

 Смежные вопросы

  • Нет связанных вопросов^_^