Я создал 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)
Благодарим за помощь и понимание.
Это зафиксировал его. Спасибо огромное! Итак, лучше ли явно указывать источники, если это возможно? Что обычно будет сделано, если имеется большое количество источников? Можно ли вызвать другой файл для создания других источников? – Program0
Чтобы включить другой файл, вы можете использовать 'include sources.mk'. И вы можете использовать его для перегруппировки всех источников проекта [пример] (https://github.com/Stargateur/spider/blob/6e31676a092f7c0477be80cd4043dbfe84ed28b2/server.mk). Лучше выделять исходные файлы, потому что вы можете добавить временный файл cpp в свою папку или хотите сохранить исходный файл, но не использовать его в проекте. С помощью шаблона вы не можете выбрать файлы источников. Как и в файле cpp, вы не включаете каждый заголовок. В вашем файле Makefile вы не добавляете весь исходный файл: p – Stargateur