我创建了一个基于GNU的makefile制作教程:https://www.gnu.org/savannah-checkouts/gnu/make/manual/html_node/index.html#SEC_Contents。制作:循环依赖删除C++
make文件在初始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)
问题1:如果通配符扩展导致循环依赖,我怎么能解决?
问题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)
感谢您的帮助和见解。
问题解决了。非常感谢!那么,如果可能的话,明确声明来源是否更好?如果有大量来源通常会做什么?可以调用另一个make文件来创建其他来源? – Program0
要包含其他文件,您可以使用'include sources.mk'。你可以用它来重新组合一个项目的所有来源[例子](https://github.com/Stargateur/spider/blob/6e31676a092f7c0477be80cd4043dbfe84ed28b2/server.mk)。显式源文件更好,因为您可以在文件夹中添加临时cpp文件,或者希望保留源文件但不将其用于项目。通配符不能选择源文件。就像在cpp文件中一样,你不包含每个头文件。在你的Makefile中,你不需要添加所有的源文件:p – Stargateur