Makefile循环依赖错误

Posted

技术标签:

【中文标题】Makefile循环依赖错误【英文标题】:Makefile circular dependency error 【发布时间】:2015-10-17 03:45:31 【问题描述】:

我有一个编译 src 文件夹中所有 cpp 文件的 makefile。所有的 cpp 文件都依赖于它们的 .h 文件。所以我有一个规则来做所有这些(我认为)。

但我想从源文件列表中删除 main.cpp,因为它没有相应的头文件。

我有从 cpp 文件列表中删除 main 的代码。然后我写了一个单独的规则来编译main。我认为这是我出错的地方。

这是生成文件和错误。

CC := g++
CFLAGS := -g -O2
BIN_DIR := bin
BUILD_DIR := build
SRC_DIR := src
TARGET := wavfiletool.exe
MAIN := WavFileTool 

SOURCES := $(wildcard src/*.cpp)
SOURCES := $(filter-out src/$(MAIN).cpp, $(SOURCES))
OBJECTS := $(SOURCES:$(SRC_DIR)/%.cpp=$(BUILD_DIR)/%.o)

$(BIN_DIR)/$(TARGET): $(MAIN).o $(OBJECTS) 
    $(CC) $(OBJECTS) $(CFLAGS)  -o $@ 

$(MAIN).o: $(MAIN).cpp
    $(CC) $(CFLAGS) -c $(MAIN).cpp -o $(MAIN).o

$(OBJECTS): $(BUILD_DIR)/%.o : $(SRC_DIR)/%.cpp : $(SRC_DIR)/%.h
    @$(CC) $(CFLAGS) -c $< -o $@

错误:

make: Circular WavFileTool <- WavFileTool dependency dropped.

编辑:当我从目标行中删除 $(MAIN).o 依赖项时,错误消失了。

【问题讨论】:

最后一条规则甚至不应该起作用,那额外的:在那里做什么? 我认为该规则会使对象依赖于 cpp 而 cpp 依赖于 .h :S 我在您显示的代码中没有看到任何循环依赖。 那个makefile肯定会给出那个错误信息。 【参考方案1】:

循环依赖是由WavFileTool 之后的虚假空格引起的,导致$(BIN_DIR)/$(TARGET) 的目标看起来像这样

bin/WavFileTool.exe: WavFileTool .o (other .o files)

在下一条规则中,WavFileTool 由于同样的问题而最终取决于自己:

WavFileTool .o: WavFileTool .cpp

摆脱空间是不够的,但是因为你最后有一个无效的静态规则(你不能像这样“链接”目标),并且因为你没有正确指定 $(MAIN).o 的路径.

与其修复您的 makefile,不如使用更标准的解决方案来生成自己的依赖项可能更有用:

BIN_DIR   := bin
BUILD_DIR := build
SRC_DIR   := src
TARGET    := WavFileTool.exe

CC       := g++
CPPFLAGS := -MMD -MP
CXXFLAGS := -g -O2

SOURCES := $(wildcard $(SRC_DIR)/*.cpp)
OBJECTS := $(SOURCES:$(SRC_DIR)/%.cpp=$(BUILD_DIR)/%.o)
DEPS    := $(wildcard $(BUILD_DIR)/*.d)
RM       = -del $(subst /,\,$1)

.PHONY: clean

$(BIN_DIR)/$(TARGET): $(OBJECTS)
    $(CC) $(LDFLAGS) $^ $(LDLIBS) -o $@

$(OBJECTS): $(BUILD_DIR)/%.o: $(SRC_DIR)/%.cpp
    $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $(OUTPUT_OPTION) $<

clean: ; $(call RM, $(DEPS) $(OBJECTS))

include $(DEPS)

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

include 之后的最后一部分禁用重新制作 makefile 和其他一些隐式规则,这在使用 -d 调试 make 文件时非常有用,否则您必须处理大量不必要的输出。

【讨论】:

我很困惑。我的 make 文件中的任何地方都看不到空格:s @ScottF WavFileTool vs WavFileTool ,你现在可以看到了吗?

以上是关于Makefile循环依赖错误的主要内容,如果未能解决你的问题,请参考以下文章

依赖树中的 Makefile 循环

将具有循环链接依赖的makefile转换为CMake

出现错误:资源之间的循环依赖

通过将同一个库链接两次来解决循环依赖关系?

Angular 提供程序,循环依赖错误

如何解决xcode中的循环依赖错误